プログラムで音波を発生させ、AVAudioPlayerで再生したい。波形をリニアPCM、44100Hz、モノラル、サンプルあたり8ビットとしてエンコードするコードがあります。
AVAudioPlayerがこのバッファをPCMとして認識するために、このバッファをラップアラウンドする必要があるエンベロープの種類がわかりません。
プログラムで音波を発生させ、AVAudioPlayerで再生したい。波形をリニアPCM、44100Hz、モノラル、サンプルあたり8ビットとしてエンコードするコードがあります。
AVAudioPlayerがこのバッファをPCMとして認識するために、このバッファをラップアラウンドする必要があるエンベロープの種類がわかりません。
PCMは、アナログオーディオ信号の単なるデジタル表現です。残念ながら、オーディオに関するメタデータ(チャネル、ビット深度、サンプルレート)はすべてカプセル化されていません。これらはすべて、上記のPCMデータを適切に読み取るために必要です。AVAudioPlayerオブジェクトでこれらの変数を手動で設定できる限り、AVAudioPlayerはNSDataオブジェクトにラップされたこのPCMデータを受け入れると思います。残念ながら、これらの変数は読み取り専用であるため、ドキュメントにはAVAudioPlayerがCore Audioで処理できるものはすべて処理できると記載されていますが、生のLPCMデータを処理する方法はありません。
zoulが述べたように、これを行う最も簡単な方法は、WAVヘッダーをスローすることだと思います。これは、ヘッダーがAVPlayerに上記の必要な変数を通知するためです。44バイトで、簡単にモックアップされ、適切に定義されています。上記と同じ定義を使用して、wavヘッダーのエンコードとデコードを実装しました。また、変更されていないLPCMデータの前に追加されるだけです。
WAVヘッダーを追加すると役立つでしょうか?
AVAudioPlayer initWithData で使用するオーディオ フロート サンプルのバッファーをインメモリ WAV ファイルに変換する Swift 5 の例を (GitHub Gist として) 投稿しました。