ffmpeg协议之av_seek_frame接口

举报
想飞的咸鱼 发表于 2022/11/03 19:13:43 2022/11/03
【摘要】 ffmpeg协议 音视频处理

        C库中操作文件的函数中有一个seek函数,能够设置文件指针的位置;同理av_seek_frame也是同样的功能,能够通过时间戳回到我们想要的音视频流的某个位置,类似于播放器中快进,快退的功能。

函数原型:

int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);
参数:
  s: AVFormatContext 指针。包含了流媒体的信息。
  stream_index:流索引,流即视频流,音频流等,视频流索引为0,音频流索引为1 。-1:表示默认流。
  timestamp: 时间戳
  flags:seek标志,有以下四种:
        AVSEEK_FLAG_BACKWARD  是seek到请求的时间戳之前最近的关键帧
        AVSEEK_FLAG_BYTE             是基于字节位置的查找,精确到字节 mp4格式不能使用该标识会seek失败
        AVSEEK_FLAG_ANY              是可以seek到任意帧,不一定是关键帧,可能是p帧,b帧,因此使用时可能会导致花屏    flv格式不能使用该标识会seek失败
        AVSEEK_FLAG_FRAME          是基于帧数量快进 

参数stream_index为视频流索引时,跳转是以视频时间戳为基准,stream_index为音频流索引时跳转是以音频流时间戳为基准。

sec(实际时间) = pts*av_q2d(stream[video_index]->time_base);

pts = sec/av_q2d(stream[video_index]->time_base);

跳到视频1秒处:

av_seek_frame(s, video_index, pts, AVSEEK_FLAG_BACKWARD);

跳到音频1秒处:

av_seek_frame(s, audio_index, pts, AVSEEK_FLAG_BACKWARD);

视频和音频跳到相同的时间位置但是流数据帧位置不相同,因为一般情况下视频帧的起始时间戳为0,音频帧的时间戳为-1024 。

跳转到文件的起始位置:

av_seek_frame(s, -1, 0, AVSEEK_FLAG_BACKWARD);

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。