【问题标题】:iOS LPCM Non-interleaved Audio input with 2 channels: not possible?带有 2 个通道的 iOS LPCM 非交错音频输入:不可能?
【发布时间】:2010-12-12 16:36:17
【问题描述】:

在aurioTouch 示例应用程序中,RemoteIO 音频单元配置为 8.24 定点格式的 2 通道非交错 LPCM。这是 iOS 平台上的首选格式,我假设这就是硬件 ADC 发出的内容。他们甚至对此发表了评论(source):

// set our required format - Canonical AU format: LPCM non-interleaved 8.24 fixed point
outFormat.SetAUCanonical(2, false);

所以我希望当应用程序稍后收到一个音频缓冲区时,它的 mData 成员中会以某种顺序包含两个通道的数据。像这样的:

mData = [L1, L2, L3, L4, R1, R2, R3, R4];

其中 L 和 R 代表来自立体声麦克风左右声道的数据。只是似乎不可能,因为SetAUCannonical() 没有设置足够的内存来保存额外的频道:

void    SetAUCanonical(UInt32 nChannels, bool interleaved)
{
    mFormatID = kAudioFormatLinearPCM;
#if CA_PREFER_FIXED_POINT
    mFormatFlags = kAudioFormatFlagsCanonical | (kAudioUnitSampleFractionBits << kLinearPCMFormatFlagsSampleFractionShift);
#else
    mFormatFlags = kAudioFormatFlagsCanonical;
#endif
    mChannelsPerFrame = nChannels;
    mFramesPerPacket = 1;
    mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
    if (interleaved)
        mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);
    else {
        mBytesPerPacket = mBytesPerFrame = sizeof(AudioUnitSampleType);
        mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
    }
}

如果 'interleaved' 为 false,它不会将 'mBytesPerPacket' 和 mBytesPerFrame' 乘以通道数。帧中没有足够的位来存储额外的频道。

那么当示例代码要求 2 个通道时,它会不会有点误导?它是否应该只要求 1 个频道,因为无论如何它都会返回:

outFormat.SetAUCanonical(1, false);

我可以像这样“修复”SetAUCannonical 以使事情变得清晰吗?:

mChannelsPerFrame = nChannels;
if (!interleaved) {
    mChannelsPerFrame = 1
    mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
mFramesPerPacket = 1;
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);     

或者还有什么其他原因会要求您提供 2 个频道?我什至不认为麦克风是立体声麦克风。

【问题讨论】:

    标签: iphone ios audio core-audio microphone


    【解决方案1】:

    内置麦克风和耳机麦克风输入均为单声道。

    相机连接套件可能允许在运行某些早期操作系统版本的一些较新的 iOS 设备上从某些 USB 麦克风输入立体声音频,但我没有看到任何关于这与当前操作系统版本一起使用的报告。

    另外,检查 2 通道(立体声)非交错格式是否可能将 2 个缓冲区返回到 RemoteIO 回调,而不是 1 个缓冲区中的连接数据。

    【讨论】:

    • 今晚我会调查此事。
    • 这是我的经验。我没有为交错状态指定任何内容。模拟器默认需要 IO 回调中的单个交错缓冲区,但设备默认需要 2 个单通道缓冲区。
    【解决方案2】:

    我认为您混淆了“交错”和“非交错”以及 CoreAudio 如何在 ABL 中为您提供这些数据。 SetAUCanonical() 正在做正确的事情。 ABL 有一个可变的缓冲区数组,在非交错的情况下,每个缓冲区只保存单个通道的数据。

    【讨论】:

      【解决方案3】:

      问题在于(有时)具有误导性的变量名称。我也不喜欢它,但这里是对正在发生的事情的解释。

      当mFormatFlags 设置为NonInterleaved (of any form) 时,mChannelsPerFrame 指定通道数,其余字段应指定单个通道所需的属性。 因此,您不需要增加通道数。正确的值是:

      mBytesPerPacket = mFramesPerPacket * sizeof(sampleSizeInBytes);   // e.g. sizeof(float)
      mBytesPerFrame = sizeof(sampleSizeInBytes);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多