RemoteIO音频单元播放回调中的AudioBufferList内容

时间:2011-11-16 01:03:47

标签: ios audio audiounit

我想在通往iOS设备扬声器的途中“拦截”音频数据。我相信这可以使用remoteIO音频单元和回调来完成。在下面的playbackCallback中,ioData实际上是否包含任何音频数据?

static OSStatus playbackCallback(void *inRefCon, 
                                 AudioUnitRenderActionFlags *ioActionFlags, 
                                 const AudioTimeStamp *inTimeStamp, 
                                 UInt32 inBusNumber, 
                                 UInt32 inNumberFrames, 
                                 AudioBufferList *ioData) { ... } 

我很困惑,因为有关ioData的日志信息似乎暗示它包含音频数据......

// if (ioData->mNumberBuffers > 0)
AudioBuffer buffer = ioData->mBuffers[0];
NSLog(@"buffer.mNumberChannels: %ld", buffer.mNumberChannels); // prints 2
NSLog(@"buffer.mDataByteSize  : %ld", buffer.mDataByteSize); // prints 4096

但是,从ioData的内容创建CMSampleBufferRef并使用AVAssetWriter将其写入CoreAudioFile会生成静默文件。输出文件的长度似乎很好(几秒钟)但是在Audacity中打开文件会显示一条平面线。

在阅读了大量SO帖子并尝试了大量的remoteIO音频单元示例代码后,我开始怀疑上面的ioData是否包含应该在playbackCallback中填充的预先调整大小的空缓冲区。

1 个答案:

答案 0 :(得分:6)

playCallback中的ioData缓冲区是回调应放置您想要播放的音频样本的位置。缓冲区在通往扬声器的途中不包含其他截获的音频。