在RemoteIOaudio单元回放callback中的AudioBufferList内容

我想在截取iOS设备的扬声器的过程中“截取”audio数据。 我相信这可以使用remoteIOaudio单元和callback来完成。 在下面的playbackCallback中,ioData实际上是否包含任何audio数据?

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

我很困惑,因为有关ioData的日志信息似乎意味着它包含audio数据…

 // 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的内容创build一个CMSampleBufferRef并使用AVAssetWriter将其写入CoreAudioFile会生成一个静默文件。 输出文件的长度似乎很好(几秒钟),但在Audacity中打开文件显示了一个扁平线。

在阅读大量的SOpost并试验了很多remoteIOaudio单元示例代码之后,我开始怀疑上面的ioData是否包含应该在playbackCallback中填充的预大小但空的缓冲区。

playCallback中的ioData缓冲区是callback应放置要播放的audio样本的位置。 缓冲区中不包含在通往扬声器的途中截获的其他audio。