AudioQueue 样本值错误

Posted

技术标签:

【中文标题】AudioQueue 样本值错误【英文标题】:AudioQueue sample values are wrong 【发布时间】:2012-03-29 14:00:10 【问题描述】:

我需要读取音频样本值。我正在使用该 audioQueue 回调(来自 Apple SpeakHere 示例):

     UInt32 samplesCount = inCompleteAQBuffer->mAudioDataBytesCapacity / 2;

    UInt16 *samples = (UInt16 *)inCompleteAQBuffer->mAudioData;   

    for (int i=0; i < samplesCount; i++)
    
        printf("%i\n", samples[i]); 
    

返回值,但是当我将它们与 audacity 中的图表进行比较时,它们似乎是错误的:

Audacity 值从 1 (65535) 到 -1 (0)。所以逻辑上第一个样本值应该是 32767,第二个应该是 ~50 000 ...

但我收到了其他结果:

    value - position

    65535 - 0
    29501 - 1
    26086 - 2
    63656 - 3
    28477 - 4
    65407 - 5
    36802 - 6
    36546 - 7
    18244 - 8
    17220 - 9

    player settings:

    (Float64) mSampleRate = 44100
    (UInt32) mBytesPerPacket = 2
    (UInt32) mFramesPerPacket = 1
    (UInt32) mBytesPerFrame = 2
    (UInt32) mChannelsPerFrame = 1
    (UInt32) mBitsPerChannel = 16
    (UInt32) mReserved = 0

问题 - 为什么从 mAudioData 返回的样本值是错误的?

【问题讨论】:

【参考方案1】:

该文件的字节序与您的系统不同。您必须交换每个样本的字节顺序。样本也是有符号的 16 位整数 (SInt16),而不是 UInt16。因此最大值是 32767(不是 65535),最小值是 -32767。

查看 ExtendedAudioFile.h 和 AudioConverter.h 以获取转换帮助。

【讨论】:

感谢您的回答。但是我已经使用了来自link 和 SInt32 的音频单元示例来获取样本值,它对我有用。顺便说一句,SInt16 和 UInt16 之间有区别吗?我的意思是使用 UInt16 而不是 SInt16 来获取从 0(SInt16 中为 -32767)到 65535(SInt16 中为 32767)范围内的值是错误的? 我没问题,但是除非您进行字节交换并使用 SInt16,否则您不会看到与 audacity 相同的值。

以上是关于AudioQueue 样本值错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 上的 AudioQueue 服务获取样本

AudioQueue 录制音频样本

AudioQueue 字节发送到服务器

使用 AudioQueue 读取音频缓冲区数据

AudioQueue 和 iOS4?

AudioQueue 吃了我的缓冲区(前 15 毫秒)