1

ファイルのサンプル レートを変更せずに、WAV ファイルから生のオーディオ サンプル (理想的には float として) を取得する最も簡単な方法は何ですか?

https://stackoverflow.com/a/4572990/1116197の例に従いましたが、からフロートを抽出する方法がわかりませんbuffer。やるだけbuffer[n]じゃダメ。basicDescription.mFormatFlagsファイルによるとkAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

float代わりに使用してデータを(sとして)抽出することができましたがExtAudioFileRef、それには必要な出力形式を指定する必要がありますが、sampleRateを変更したくありません。例えば、あなたができる

AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat;
audioFormat.mBitsPerChannel = sizeof(Float32) * 8;
audioFormat.mChannelsPerFrame = 1; // Mono
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(Float32);  // == sizeof(Float32)
audioFormat.mFramesPerPacket = 1;
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame; // = sizeof(Float32)


ExtAudioFileSetProperty(
    fileRef,
    kExtAudioFileProperty_ClientDataFormat,
    sizeof (AudioStreamBasicDescription), 
    &audioFormat
),

AudioStreamBasicDescription最初に using を使用してファイルを取得できたと思いますExtAudioFileGetPropertyが、Apple ドキュメント ( http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html ) によると、プロパティ IDkExtAudioFileProperty_FileDataFormatどちらが読み取り専用であるかが必要ですA file’s data format. Value is a read-only AudioStreamBasicDescription struct.--したがって、変更できません追加mFormatFlags = kLinearPCMFormatFlagIsFloat

したがって、上記を実行して、新しい ASBD を作成し、すべてをコピーできると思いますが、すべてが非常に複雑すぎるように見えるので、間違ったツリーを完全に吠えているのではないでしょうか? これを行う簡単な方法はありますか?!

4

2 に答える 2

2

最も一般的な .WAV ファイルは、44 バイトのヘッダーの後に 16 ビットまたは 2 バイトのリトル エンディアンの生の PCM オーディオ サンプルが続くだけです。リトルエンディアン CPU (x86、ARM など) でこれらのタイプのファイルの 1 つを使用している場合は、最初の 44 バイトをスキップしてから、short int を読み取って float に変換するだけです。

于 2013-07-05T06:45:08.997 に答える
0

発見したように、これを行うには、まずファイルのデータ形式を取得してから、ファイルのサンプル レートでクライアント データ形式を作成する必要がありますが、必要なサンプル サイズとタイプを使用します。これは、Core Audio の世界ではそれほど多くない 1 つの追加の関数呼び出しに要約されます。

于 2013-07-05T13:09:41.543 に答える