1

libavcodec をバックエンドとして使用してメディアを再生しようとしています。ffmpeg-2.0.1 をダウンロードし、./configure,make および make install を使用してインストールしました。アプリケーションを実行してオーディオ ファイルを再生しようとしているときに、最初のオーディオ ストリームのチェック中にセグメンテーション エラーが発生しました。

AVFormatContext* container = avformat_alloc_context();
if (avformat_open_input(&container, input_filename, NULL, NULL) < 0) {
    die(“Could not open file”);
}

if (av_find_stream_info(container) < 0) {
    die(“Could not find file info”);
}

av_dump_format(container, 0, input_filename, false);
int stream_id = -1;
int i;

for (i = 0; i < container->nb_streams; i++) {
    if (container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
        stream_id = i;
        break;
    }
}

if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO) でセグメンテーション違反が発生する

どうすればこれを修正できますか? 私はubuntu 12.04で作業しています。

4

1 に答える 1

1

最初から割り当てる必要はありませんAVFormatContext

また、関数av_find_stream_infoは非推奨です。次のように変更する必要がありますavformat_find_stream_info

av_register_all();
avcodec_register_all();

AVFormatContext* container = NULL;
if (avformat_open_input(&container, input_filename, NULL, NULL) < 0) {
    die(“Could not open file”);
}

if (avformat_find_stream_info(container, NULL) < 0) {
    die(“Could not find file info”);
}

// av_dump_format(container, 0, input_filename, false);

int stream_id = -1;
int i;

for (i = 0; i < container->nb_streams; i++) {
    if (container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
        stream_id = i;
        break;
    }
}

また、それav_dump_formatがここで役に立ったかどうかはわかりません...


編集: 次のようなことを試しましたか:

av_register_all();
avcodec_register_all();

AVFormatContext* container = NULL;
AVCodec *dec;

if ( avformat_open_input(&container, input_filename, NULL, NULL) < 0) {
    // ERROR
}

if ( avformat_find_stream_info(container, NULL) < 0) {
    // ERROR
}

/* select the audio stream */
if ( av_find_best_stream(container, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0) < 0 ) {
    // ERROR
}
于 2013-08-19T14:14:42.357 に答える