2012-03-29 18 views
1

オーディオサンプル値を読み取る必要があります。私は(アップルSpeakHere例から)そのaudioQueueコールバックのために使用しています: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

ファイルのエンディアンがシステムとは異なります。各サンプルのバイト順を入れ替える必要があります。また、サンプルは、UInt16ではなく、符号付き16ビット整数(SInt16)です。したがって、最大値は32767(65535ではなく)で、最小値は-32767です。

変換のヘルプについては、ExtendedAudioFile.hとAudioConverter.hを参照してください。

+0

ありがとうございます。しかし、私は既に[リンク](https://github.com/reinforce-lab/MonoTouch.AudioUnit)とSInt32のサンプルオーディオを使用してサンプル値を取得しました。 Btw、SInt16とUInt16の違いは? SInt16の代わりにUInt16を使用して0(SInt16の-32767)から65535(SInt16の32767)までの範囲の値を取得することは間違っていますか? – f3n1kc

+0

私は大丈夫ですが、バイトスワップとSInt16を使用しない限り、大胆さと同じ値は表示されません。 – hooleyhoop

関連する問題