3

AudioFilePlayer (Generator unit) -> GenericOutput (Output unit) を持つオーディオ グラフを作成しています。

基本的な考え方:

AudioFilePlayer は、その出力にオーディオ フレームを生成しています。ジェネリック出力は、AudioFilePlayer の出力からデータを入力として受け取ります。そのデータを取得して他のバッファに保存するよりも。

私の質問は、一般的な出力からデータを取得してオフライン レンダリング用のデータを取得する方法です。

私はそれについていくつかの調査を行い、GenericOutput ユニットで AudioUnitRender を使用してオーディオ データをプルする必要があることがわかりました。

Uint32 frames = 512;
timestamp.mSampleTime = 0;

... While Loop ...

timestamp.mFlags = kAudioTimeStampSampleTimeValid;

bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mNumberChannels = param->inputFormat.mChannelsPerFrame;
bufferList.mBuffers[0].mDataByteSize = frames * param->inputFormat.mChannelsPerFrame * sizeof(float);
bufferList.mBuffers[0].mData = NULL;

AudioUnitRenderActionFlags flags = 0;

OSStatus error = noErr;
if ((error = AudioUnitRender(param->genericOutput, &flags, &timestamp, 0, frames, &bufferList)) != noErr)
{
    printf("Cannot AudioUnitRender: %d\n", error);
}

timestamp.mSampleTime += frames;

しかし、番号-50でエラーが発生します。

入力パラメータの設定が間違っていませんか? レンダー コールバック関数を GenericOutput ユニットに登録する必要はありますか?

4

2 に答える 2

2

問題は、AUGraphInitialize() を呼び出した後に GenericOutput StreamFormat を設定したことです。その前にやらなければならない。

CAShow(reader.graph) を使用してオーディオ グラフのログを取得しました。これにより、設定しようとしてもフォーマットが変更されていないことがわかりました。

于 2013-03-04T11:17:33.830 に答える
0

GenericOutputノードを使用してオフライン レンダリングが正常に完了したことを願っています。これをどのように行ったか詳細を教えてください。

  • ループ内で、データが含まれていないバッファ リストを渡そうとしています。
  • 出力をファイルに保存する必要がある場合は、何をしなければならないか (またはどこに置くかExtAudioFileWriteAsync)。
  • while ループの終了条件は何ですか。

  • istimestampは、ローカルで宣言された変数です。

于 2013-03-08T13:32:13.910 に答える