【问题标题】:AudioBufferList contents in remoteIO audio unit playback callbackremoteIO 音频单元播放回调中的 AudioBufferList 内容
【发布时间】:2011-12-30 00:41:48
【问题描述】:

我想“拦截”传输到 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 中的预定大小但为空的缓冲区。

【问题讨论】:

    标签: ios audio audiounit


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多