当前位置:  开发笔记 > 编程语言 > 正文

ffmpeg av_seek_frame

如何解决《ffmpegav_seek_frame》经验,为你挑选了2个好方法。

我试图使用ffmpeg的av_seek_frame方法在电影中寻找,但是我在确定如何生成时间戳以寻找时遇到的最麻烦.假设我想向前或向后寻找x个帧,我知道电影目前在哪个帧,我该怎么做呢?



1> Hugo Maxwell..:

我是这样做的:

// Duration of one frame in AV_TIME_BASE units
int64_t timeBase;

void open(const char* fpath){
    ...
    timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE) / int64_t(pCodecCtx->time_base.den);
    ...
}

bool seek(int frameIndex){

    if(!pFormatCtx)
        return false;

    int64_t seekTarget = int64_t(frameIndex) * timeBase;

    if(av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_ANY) < 0)
        mexErrMsgTxt("av_seek_frame failed.");

}

AVSEEK_FLAG_ANY可以搜索每个帧而不仅仅是关键帧.



2> 小智..:

答案很简单:你应该有一个AVFormatContext对象.它的duration属性告诉你文件在av_seek_frame中可以使用的时间戳乘以1000的时间长度,因此将其视为100%.然后,您可以计算您想要寻找的视频的距离.

如果你想前进一帧,只需调用av_read_frame和avcodec_decode_video,直到它用非零值填充got_picture_ptr.在调用avcodec_decode_video之前,请确保来自av_read_frame的数据包来自视频流.avcodec_decode_video然后将填充AVFrame结构,您可以使用它来执行任何操作.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有