我想在传输到 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 中填充的预先确定大小但为空的缓冲区。
最佳答案
playCallback 中的 ioData 缓冲区是回调应该放置您要播放的音频样本的地方。缓冲区不包含在发送到扬声器的途中截获的其他音频。
关于ios - remoteIO音频单元播放回调中的AudioBufferList内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145353/