2

ffmpeg を使用して、さまざまなファイル形式からオーディオ サンプルをデコードしようとしています。したがって、このディスカッションのコードに基づいていくつかの実験を開始しました: Android で FFmpeg を介してオーディオをデコードする方法。最新の FFMPEG リリース (1.0) を使用し、https://github.com/halfninja/android-ffmpeg-x264を使用してコンパイルします。

AVFormatContext * pFormatCtx;

avcodec_register_all();
av_register_all();

int lError;
if ((lError = avformat_open_input(&pFormatCtx, filename, NULL, 0))
        != 0) {
    LOGE("Error open source file: %d", lError);
    return;
}
if ((lError = avformat_find_stream_info(pFormatCtx, 0)) < 0) {
    LOGE("Error find stream information: %d (Streams: %d)", lError, pFormatCtx->nb_streams);
    return;
}
LOGE("audio format: %s", pFormatCtx->iformat->name);
LOGE("audio bitrate: %d", pFormatCtx->bit_rate);
audioStreamIndex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO,
        -1, -1, &codec, 0);

//if (audioStreamIndex < 0 || audioStreamIndex >= pFormatCtx->nb_streams)
//  audioStreamIndex = 0;

LOGE("Stream: %d (total: %d)", audioStreamIndex, pFormatCtx->nb_streams);
LOGE("audio codec: %s", codec->name);

FFMPEG は enable-decoder=mp1/mp2/mp3/ogg/vorbis/wav/aac/theora を使用してコンパイルされ、外部ライブラリ (libmp3lame、libtheora など) は使用されません。

mp3 および wav ファイルを開くと、問題なく動作し、たとえば mp3 の場合、次の出力が生成されます。

オーディオ形式: mp3

音声ビットレート: 256121

ストリーム: 0 (合計: 1)

オーディオコーデック: mp3

しかし、ogg ファイルを開こうとすると、次のようになります。

ストリーム情報検索エラー: -1 (ストリーム: 1)

return ステートメントを手動で設定audioStreamIndex=0してコメントアウトすると、次のようになります。

ストリーム情報検索エラー: -1 (ストリーム: 1)

オーディオ形式: mp3

オーディオ ビットレート: 0

ストリーム: 0 (合計: 1)

オーディオコーデック: mp3

m4a (AAC) の場合、次のようになります。

オーディオ形式: mp3

音声ビットレート: 288000

ストリーム: 0 (合計: 1)

オーディオコーデック: mp1

しかし、後で失敗しavcodec_decode_audio3ます。

また、成功せずに手動でフォーマットを強制しようとしました:

AVInputFormat *pForceFormat= av_find_input_format("ogg");
if ((lError = avformat_open_input(&pFormatCtx, filename, pForceFormat, 0))
// continue

mp3 と wav でのみ動作し、他の形式では失敗する読み込みコードに何か問題がありますか?

よろしく、

4

1 に答える 1