FFMpeg中seek函数解析

Seek

FFmpeg提供了一个seek函数,原型如下

/**
 * Seek to the keyframe at timestamp.
 * 'timestamp' in 'stream_index'.
 *
 * @param s media file handle
 * @param stream_index If stream_index is (-1), a default
 * stream is selected, and timestamp is automatically converted
 * from AV_TIME_BASE units to the stream specific time_base.
 * @param timestamp Timestamp in AVStream.time_base units
 *        or, if no stream is specified, in AV_TIME_BASE units.
 * @param flags flags which select direction and seeking mode
 * @return >= 0 on success
 */
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,
                  int flags);

这个函数不管你当前在什么时间点上,都可以seek到任何合理位置。比如要实现在当前的基础上向后或向前跳转10秒,我们可以在av_read_frame函数拿到的包中含有当前时间戳的基础上增加或减少一个10000(换算成播放时间单位)再seek即可。所以这个函数可以用做进度的拖放、前进/后退一定时间、循环播放等功能。

参数说明:

s:操作上下文;

stream_index:基本流索引,表示当前的seek是针对哪个基本流,比如视频或者音频等等。

timestamp:要seek的时间点,以time_base或者AV_TIME_BASE为单位。

Flags:seek标志,可以设置为按字节,在按时间seek时取该点之前还是之后的关键帧,以及不按关键帧seek等,详细请参考FFmpeg的
avformat.h说明。基于FFmpeg的所有track mode几乎都是用这个函数来直接或间接实现的。

举例说明

seek功能的实现

  • 要转跳到视频100秒(100 000毫秒)处的第一个I帧(如果没有则向前找第一个):

av_seek_frame(pFormatCtx, vid_index, 100000*vid_time_scale/time_base, AVSEEK_FLAG_BACKWARD);

  • 跳到音频80秒(80 000毫秒)处的帧(采样):

av_seek_frame(pFormatCtx, aud_index, 80000*aud_time_scale/ time_base, AVSEEK_FLAG_BACKWARD);

  • 跳到文件开始的地方开始播放:

av_seek_frame(pFormatCtx, vid_index, 0, AVSEEK_FLAG_BACKWARD);

上面的time_scale、time_base都能通过流信息获取到

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 4,831评论 0 3
  • 公司的一个项目二次开发要用到RTSP解码,对于我这个刚出道的彩笔工程师无疑是巨大的挑战。。网上教程不算多,但是...
    changeL阅读 1,646评论 0 8
  • 明尼苏达森林狼与纽约尼克斯今日还在继续讨论关于德里克-罗斯的交易,尼克斯方面想让森林狼送出白人射手内马尼亚-别利察...
    鬼神不测阅读 194评论 0 0
  • 对于销售的辅助技能来讲,主要包含:销售员的行动力、执行力、沟通力、表达力、交往力、洞察力、学习力,以及客户服务管理...
    毛正奇阅读 250评论 0 0
  • 亚健康是一种临界状态,处于亚健康状态的人,虽然没有明确的疾病,但却出现精神活力和适应能力的下降,如果这种状态不能得...
    菁菁河畔草阅读 1,317评论 0 3