ffmpeg协议之av_seek_frame接口
【摘要】 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)