ffmpeg函数avformat_seek_file出现问题

问题描述

|| 我正在尝试使用ffmpeg库在视频中寻找给定的帧。我知道有
av_seek_frame()
函数,但建议改用
avformat_seek_file()
。这里提到类似的东西。 我知道
avformat_seek_file()
不能总是带您到想要的确切帧,但这对我来说是可以的。我只想跳到最近的关键帧。所以我打开视频,找到视频流并按如下方式调用它:
avformat_seek_file( formatContext,streamId,frameNumber,AVSEEK_FLAG_FRAME )
它总是返回0,所以我将其理解为正确的结束。但是,它不能正常工作。在调用
avformat_seek_file()
之前和之后,我都会像这样检查字节位置。实际上,它会发生变化,但是每当我尝试放置不同的目标帧号时,它总是以相同的方式发生变化!我的意思是,即使使用不同的“ 5”值,此调用后的字节位置也始终相同。显然,我在做错事,但我不知道到底是什么。我不知道这是否重要,但我正在使用.h264文件。我尝试使用不同的标志,不同的文件,使用时间戳而不是帧,在前后冲洗缓冲区等等,但是对我来说不起作用。如果有人可以告诉我这是怎么回事,我将不胜感激。     

解决方法

        我遇到了同样的问题,请参见下面的代码(它对我有用):
    ...
    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,\"SUCCEEDED av_seek_frame: %u newPos:%d\\n\",is->pb->pos);
            avcodec_flush_buffers(is->streams[stream_index]->codec);
        }
    }
    ,        您的问题可能与您输入的原始.h264有关。尝试使用例如mp4box将其复用为.mp4文件,然后使用ffmpeg加载mp4文件并尝试再次查找关键帧。例如。:
mp4box -new -add my_file.h264 my_file.mp4