1

ffmpegライブラリを使用してビデオ内の特定のフレームを検索しようとしています。機能があることは知っていましたが、代わりav_seek_frame()に使うことをお勧めしましavformat_seek_file()た。ここで言及されている同様の何か。

avformat_seek_file()いつもあなたが望む正確なフレームにあなたを連れて行くことができるとは限らないことを私は知っています、しかしこれは私にとっては大丈夫です。最も近いキーフレームにジャンプしたいだけです。だから私はビデオを開き、ビデオストリームを見つけて次のように呼び出します:

avformat_seek_file( formatContext, streamId, 0, frameNumber, frameNumber, AVSEEK_FLAG_FRAME )

常に0を返すので、正しい仕上がりだと理解しています。ただし、正常に機能しません。を呼び出す前後に、このようにバイト位置を確認しますavformat_seek_file()。実際には変化しますが、異なるターゲットフレーム番号を入力しようとすると、常に同じように変化します。つまり、この呼び出し後のバイト位置は、frameNumber値が異なっていても常に同じです。明らかに、私は何か間違ったことをしていますが、正確には何がわかりません。それが問題になるかどうかはわかりませんが、そのために.h264ファイルを使用しています。フレームの代わりにタイムスタンプを使用したり、前後のバッファをフラッシュしたりして、さまざまなフラグ、さまざまなファイルを試しましたが、うまくいきません。誰かがそれの何が悪いのか教えてくれたらとてもありがたいです。

4

2 に答える 2

5

私は同じ問題を抱えていました、以下のコードを見てください(それは私のために働きます):

    ...
    checkPosition(input_files[file_index].ctx);
    ...

    void checkPosition(AVFormatContext *is) {
        int stream_index = av_find_default_stream_index(is);
        //Convert ts to frame
        tm = av_rescale(tm, is->streams[stream_index]->time_base.den, is->streams[stream_index]->time_base.num);
        tm /= 1000;

        //SEEK
        if (avformat_seek_file(is, stream_index, INT64_MIN, tm, INT64_MAX, 0) < 0) {
            av_log(NULL, AV_LOG_ERROR, "ERROR av_seek_frame: %u\n", tm);
        } else {
            av_log(NULL, AV_LOG_ERROR, "SUCCEEDED av_seek_frame: %u newPos:%d\n", tm, is->pb->pos);
            avcodec_flush_buffers(is->streams[stream_index]->codec);
        }
    }
于 2011-08-15T08:25:31.407 に答える
-2

あなたの問題は、入力が生の.h264であるという事実に関連している可能性があります. たとえば、mp4box を使用して .mp4 ファイルに多重化し、mp4 ファイルを ffmpeg でロードして、キーフレームを再度シークしてみてください。例えば:

mp4box -new -add my_file.h264 my_file.mp4
于 2013-04-19T04:35:42.157 に答える