2009-08-08 7 views
6

AudioQueueでオーディオデータを読み込もうとしています。これを行うと、ファイルのビット深度が16ビットであることを確認できます。しかし、実際のサンプルデータを取得すると、値は-128から128までしか表示されません。しかし、疑わしいインタリーブされたデータも見ています。データが正しく読み込まれていないことがわかります。AudioQueueでオーディオバッファデータを読み取る

そうで始まるように、私は、ソースファイルが16ビット、モノラルwavファイル、44100であることを確認することができます。

私のバッファがthusly割り当てられている:私は実行し、データを取得見ることができるだけのように、テストとして

 
AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);  

 
char *buffer= NULL; 
buffer = malloc(BUFFER_SIZE); 
assert(buffer); 

関連するすべての値が設定され、中で使用されています:

 
for(int i=0;i<BUFFER_SIZE;i++){ 
    NSLog(@"%i", buffer[i]); 
} 

ここで、ソースファイルのピークはどこにでもわかりますが、値は-128 nd 128です。これは16ビットファイルなので、値は-32768〜32768になると思います。

また、データには2つのパターンがあるようです。返さここではデータの例です:-13:

 
70 
-13 
31 
-11 
-118 
-9 
-15 
-7 
116 
-4 
31 
-1 
28 
1 
84 
2 
-123 
3 
-97 
4 
110 
5 
54 
6 
126 

を今第二列で始まる行おきを見てみましょう。それがどのように増加するか、均等にではなく、少なくともスムーズに見えますか?奇数行は、その滑らかな部分の近くにはありません。

私が最初に考えたのは、これがインターリーブされたステレオデータですが、いや、それは一つのチャンネルのみですので、右、任意のインターリーブがあってはならないということでしょうか?

私の最高の推測では、サンプルデータが2つのリターンにまたがるされているので、私はちょうど、間違ったデータを読んでいるということです。どのように正しくそれを読むために任意のアイデア?

質問全体を読んでいただきありがとうございました。また、洞察力もありがとうございます。理由です

答えて

8
char *buffer= NULL; 

。 16ビットのサンプルではなく、符号付きのバイトを反復処理しています。

代わりに2バイト値へのポインタを保持しているとして変数を宣言します、

SInt16 *buffer = NULL; 

を次にバイトとして多くのサンプルの半分を反復:

for(int i=0;i < (BUFFER_SIZE/sizeof(*buffer));i++){ 
    NSLog(@"%i", buffer[i]); 
} 

私はBUFFER_SIZEからBUFFER_SIZE_BYTESに名前を変更しますそれを明確にする。

+0

もう一度Peterに感謝します。 –