最近我遇到了下一个问题。 我使用CoreAudio AudioUnit(RemoteI / O)在iOS应用程序中播放/录制声音流。
进入音频单元的声音流是2声道LPCM,16位,有符号整数,交错(我还配置输出录制流,基本相同,但每个数据包和帧只有一个通道和2个字节)。 / p>
我已按如下方式配置输入ASBD(设置时和初始化单元时没有错误):
ASBD.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
ASBD.mBytesPerPacket = 4;
ASBD.mFramesPerPacket = 1;
ASBD.mBytesPerFrame = 4;
ASBD.mChannelsPerFrame = 2;
ASBD.mBitsPerChannel = 16;
在我的渲染回调函数中,我得到一个带有一个缓冲区的AudioBufferList(据我所知,因为音频流是交错的)。
我有一个用于测试的样本立体声文件,它是100%立体声,有2个明显的通道。我把它翻译成流,它对应于ASBD并馈送到音频单元。
当我播放样本文件时,我只听到左声道。
我很感激为什么会这样。如果需要,我可以发布更多代码。
更新:我试图设置
ASBD.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsNonInterleaved;
ASBD.mBytesPerPacket = 2;
ASBD.mFramesPerPacket = 1;
ASBD.mBytesPerFrame = 2;
ASBD.mChannelsPerFrame = 2;
ASBD.mBitsPerChannel = 16;
ASBD和我有两个缓冲区的缓冲区列表。我将我的流解交换为2个通道(1个通道用于1个缓冲区)并获得相同的结果。我尝试在iPad上使用耳机和扬声器(我知道扬声器是单声道的)。
答案 0 :(得分:1)
确定。所以我检查了我的代码并发现我使用了VoiceProcessingIO音频单元(而不是问题中的RemoteIO),这对我的应用来说基本上是正确的,因为文档说“语音处理I / O单元(子类型kAudioUnitSubType_VoiceProcessingIO)具有远程I / O单元的特性,为双向双工通信增加了回声抑制功能,还增加了自动增益校正,语音处理质量调整和静音“
当我将音频单元类型更改为RemoteIO时,我立即进行了立体声播放。我没有必要更改流属性。
基本上,VoiceProcessingIO音频设备会降级为单声道并忽略流属性。
我在Apple Developer论坛上发布了一个关于使用VoiceProcessingIO音频设备进行立体声输出的问题,但还没有得到任何答案。
对于我来说,为了做一些像回声消除这样的信号处理似乎很合乎逻辑,因为iOS设备只能录制单声道声音而无需特定的外部配件。虽然Apple文档中的任何地方都没有记录。我还发现了一个声称立体声适用于iOS5.0之前的VoiceProcessingIO AU的人。
无论如何,谢谢你的关注。关于此事的任何其他评论将不胜感激。