0

pAudioBuffer関数ffmpegから取得したcharバッファがあります:

int len = avcodec_decode_audio3(av_codec_context,
            (int16_t *) pAudioBuffer, &out_size, &packet);

オーディオ形式はサンプルあたり2バイトであることを知っています。2バイトごとに短い値に変換する必要があります。以下のコードスニペットを使用しようとしましたが、短い値ではなくゼロになることがよくあります。

int shortBufIndex = 0;
for (int i = 0; i < (out_size); i += 2) {
    char b1 = pAudioBuffer[i];
    char b2 = pAudioBuffer[i + 1];
    short sample = atoi(&b1) + atoi(&b2);
    shortBuffer[shortBufIndex] = sample;
    shortBufIndex++;
    LOGI("BUFFER_ITEM='%d'", sample);
}

私が間違っているのは、charバッファの2バイトごとにshortとその逆に変換する方法です。

アップデート:

システムのバイト順序はLITTLE_ENDIANです。次のようにテストしました:AndroidNDKのエンディアン

バッファ内の2バイトごとを短いタイプのサンプルに変換して戻すにはどうすればよいですか。コードサンプルを教えてください。

アップデート

ペアとしてshortにアクセスしようとしましたが、これが私の修正コードですが、機能しません。音が聞こえません。

    int shortBufIndex = 0;
    for (int i = 0; i < (out_size); i += 2) {
        char * byte = (char *) pAudioBuffer[i];
        short * sample = byte;
        shortBuffer[shortBufIndex] = sample;
}

私が間違っているのは何ですか?次のような変換が必要です。バイト配列から短い配列に変換し、Javaではcに戻します。

4

3 に答える 3

2

変数のアドレスでのatoi()の使用は完全に間違っており、正しくありません。これは、値のASCII表現を数値に変換するためのものです。あなたの場合、実際には「文字」のバッファではなく、バイト値のバッファがあります。これは、Cの歴史の下では、int8_tなどのより最近の決定的なものではなく、 char型で一般的に実装されます。

文字バッファと短いバッファの間で変換するには、最初に、文字バッファのエンコーディングがシステムのネイティブエンディアン順であるか、それとは逆であるかという重要な質問に答える必要があります。

ネイティブエンディアン順の場合、Cなどの言語では、ポインタ型をshortにキャストし、バイトのペアとしてデータにアクセスするだけです。

ただし、順序が逆の場合は、2バイトにアクセスし、通常とは逆の順序で結合(shift + add)する必要があります。これを行うためのマクロがあり、それを使用できますが、手動で行うと、機能が完全に明らかになるという利点があります。

于 2012-12-15T17:48:25.987 に答える
1

ナ。あなたは書く必要があります

short sample = b1<<8|b2;

または、エンディアンの状況に応じて、b1とb2を交換する必要があります

于 2012-12-15T17:48:18.407 に答える
1
short *pshBuf = (short*)pCharBuf;

できます。ライブプロジェクトでも同じものを使っています。

于 2012-12-18T09:54:20.233 に答える