2012-03-29 39 views
1

我需要读取音频采样值。我使用的是audioQueue回调(从苹果SpeakHere为例):AudioQueue采样值错误

 UInt32 samplesCount = inCompleteAQBuffer->mAudioDataBytesCapacity/2; 

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

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

值返回,但是当我从大胆图进行比较他们,他们似乎是错的:

screen

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返回错了?

回答

2

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

看看ExtendedAudioFile.h和AudioConverter.h中的帮助转换。

+0

谢谢你的回答。但我已经使用[链接](https://github.com/reinforce-lab/MonoTouch.AudioUnit)和SInt32的音频单元示例来获取示例值,它对我很有帮助。顺便说一句,SInt16和UInt16有区别吗?我的意思是使用UInt16而不是SInt16来获取范围从0(-32767 in SInt16)到65535(在SInt16中为32767)的值是错误的? – f3n1kc 2012-03-30 11:01:37

+0

对我来说没关系,但是除非你使用字节交换和使用SInt16,否则你不会看到与大胆相同的值。 – hooleyhoop 2012-03-30 11:31:28