我正在尝试使用ffmpeg库在视频中寻找给定的帧。我知道有av_seek_frame()
函数,但建议使用avformat_seek_file()
代替avformat_seek_file()
。类似的提到here。
我知道avformat_seek_file( formatContext, streamId, 0, frameNumber, frameNumber, AVSEEK_FLAG_FRAME )
不能总是带你到你想要的精确帧,但这对我来说没问题。我只是想跳到最近的关键帧。所以我打开视频,找到视频流并像这样调用它:
avformat_seek_file()
它总是返回0,所以我理解为正确完成。但是,它不能正常工作。我在调用frameNumber
之前和之后检查字节位置,如here。实际上它会改变,但每当我试图放置不同的目标帧数时,它总会以相同的方式改变!我的意思是,即使使用不同的{{1}}值,此调用后的字节位置也始终相同。显然,我做错了但我不知道到底是什么。我不知道它是否重要,但我正在使用.h264文件。我尝试了不同的标志,不同的文件,使用时间戳而不是帧,前后刷新缓冲等等,但它对我不起作用。如果有人能告诉我它有什么问题,我将非常感激。
答案 0 :(得分: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);
}
}
答案 1 :(得分:-1)
您的问题可能与您的输入是原始的.h264有关。尝试使用例如mp4box将其复制为.mp4文件,然后使用ffmpeg加载mp4文件并尝试再次搜索关键帧。 e.g:
mp4box -new -add my_file.h264 my_file.mp4