1

FLAC から ALAC へのトランスコーダーに取り組んでおり、ExtAudioFile を使用して ALAC に書き込もうとしています。FLAC ライブラリのコールバック ベースのシステムを使用して FLAC ファイルを読み込みます。つまり、FLAC ファイルのすべてのフレームで関数呼び出しが発生します。その呼び出し内で、バッファーをセットアップし、次のように ExtAudioFileWrite コードを呼び出します。

AudioBufferList * fillBufList;
fillBufList = malloc(sizeof *fillBufList + (frame->header.channels - 1) * sizeof fillBufList->mBuffers[0]);
fillBufList->mNumberBuffers = frame->header.channels;

for (int i = 0; i < fillBufList->mNumberBuffers; i++) {
    fillBufList->mBuffers[i].mNumberChannels = 1; // non-interleaved
    fillBufList->mBuffers[i].mDataByteSize = frame->header.blocksize * frame->header.bits_per_sample / 8;
    fillBufList->mBuffers[i].mData = (void *)(buffer[i]);
    NSLog(@"%i", fillBufList->mBuffers[i].mDataByteSize);
}

OSStatus err = ExtAudioFileWrite (outFile, 1, fillBufList);

さて、最終行の数字 1 は、FLAC ファイルの 1 フレームが対応する ALAC ファイルの 1 フレームにおそらく対応すると考えたので、私が選択したマジック ナンバーのようなものですが、そうではないようです. ExtAudioFileWrite を呼び出すたびに、エラー値 -50 (ユーザー パラメータ リストのエラー) が返されます。明らかな原因は、frame パラメーターに指定した値です。

では、私はどのような価値を提供すればよいのでしょうか。

それとも、間違った木を吠えていますか?

(補足: param 関連のエラー値にもかかわらず、本当の問題はバッファーのセットアップにあるのではないかと疑ったので、何が起こるかを確認するためだけに、ゼロに設定されたダミー バッファーを割り当てようとしました。同じエラーです。)

4

1 に答える 1

2

ExtAudioFileWrite の場合、フレーム数は書き込みたいサンプル数と同じです。32 ビット float インターリーブ データを使用している場合、mDataByteSize / (sizeof(Float32) / mNumberChannels) になります。サンプルを 1 つだけ書き込むつもりでない限り、1 であってはなりません。また、圧縮形式で記述している場合は、一定数のサンプルが必要になると思います。-50 エラーが別の問題である可能性もあります。

確認すべきことの 1 つは、ExtAudioFile が想定するバッファーは 1 つだけであることです。したがって、fillBufList->mNumberBuffers は常に 1 に等しい必要があり、ステレオを行う必要がある場合は、mBuffers[0].mNumberChannels がステレオの 2 に等しくなるように、オーディオ データをインターリーブする必要があります。

于 2012-02-09T23:20:59.980 に答える