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 样本值错误的主要内容,如果未能解决你的问题,请参考以下文章