ios - remoteIO音频单元播放回调中的AudioBufferList内容

标签 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 中填充的预先确定大小但为空的缓冲区。

最佳答案

playCallback 中的 ioData 缓冲区是回调应该放置您要播放的音频样本的地方。缓冲区不包含在发送到扬声器的途中截获的其他音频。

关于ios - remoteIO音频单元播放回调中的AudioBufferList内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145353/

相关文章:

xcode - 如何将 iOS UI 测试设置为构建依赖项,如 OCUnit?

php - 取得mp3文件的长度

objective-c - 如何在 iOS 上使用 AudioUnit.framework 配置帧大小

ios - 如何在轨道中间启动 AUAudioFilePlayer 但循环到开头?

core-audio - 是否有关于在 Mac OS X Mountain Lion 中开发音频单元的最新(2013)指南?

ios - 如何从数据库项目创建动态 UIButton?

ios - 不遵循 QoS 优先级的队列

android - 为什么只在默认位置获取录制的音频

jquery - HTML5音频m4a

ios - drawRect:在 UIView 类别中