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

希望您使用 node.js 成功完成离线渲染GenericOutput。您能否详细说明您是如何做到这一点的。

  • 您正在尝试循环传递一个没有数据的缓冲区列表。
  • 如果我们需要将输出保存到文件中,我必须做什么(或放在哪里ExtAudioFileWriteAsync)。
  • 您的 while 循环的退出条件是什么。

  • istimestamp是一个局部声明的变量。

于 2013-03-08T13:32:13.910 回答