6

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

まず、ソース ファイルが 44100、16 ビット、モノ wav ファイルであることを確認できます。

私のバッファは次のように割り当てられます:

char *buffer= NULL;
バッファ = malloc(BUFFER_SIZE);
アサート (バッファ);

関連するすべての値が設定され、以下で使用されます。

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

テストとして、取得したデータを確認できるように、次を実行します。

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

これで、ソース ファイルがいたるところでピークに達していることがわかりましたが、表示される値は -128 と 128 の最大値しかありません。これは 16 ビット ファイルであるため、値は -32768 から 32768 になると予想されます。

また、データには2パターンあるようです。返されるデータの例を次に示します。

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 行目 (-13) から 1 行おきに見ていきます。均等にではなく、少なくともスムーズに増加する様子をご覧ください。奇数行はそれほど滑らかではありません。

私の最初の考えでは、これはインターリーブされたステレオ データですが、いや、それは 1 つのチャンネルだけなので、インターリーブはありませんよね?

私の推測では、データを間違って読み取っているだけなので、サンプル データは 2 つのリターンにまたがっています。正しく読む方法はありますか?

質問全体を読んでくれてありがとう、そしてあなたが提供できる洞察をありがとう。

4

1 に答える 1

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

于 2009-08-08T06:33:23.493 に答える