FFmpeg 基本API av_seek_frame函数内部调用流程分析

1、av_seek_frame 函数定义

av_seek_frame() 是 FFmpeg 中用于跳转媒体文件中的某个时间点的 API,常用于播放器实现"快进/快退/定位"等功能。这个函数的作用是:根据时间戳,将解复用器(demuxer)跳转到合适的位置,以便从该位置开始读取数据帧(packet)。

可以跳到:

  • 指定时间戳的帧(通常为关键帧)
  • 或者粗略估计字节位置(用于某些格式如 MPEG-TS)
cpp 复制代码
//以下为 av_seek_frame() 的内部调用流程(位于 libavformat/utils.c)
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);
    // 调用 avformat_seek_file() 做具体的 seek 工作
    return avformat_seek_file(s, stream_index, INT64_MIN, timestamp, INT64_MAX, flags);
}

//然后:
int avformat_seek_file(...) {
    -> seek_frame_internal()
        -> ff_seek_frame_binary() 或 av_index_search_timestamp()
        -> 如果找不到直接偏移点,则调用 demuxer 的 read_seek / read_seek2
}
  • AVFormatContext *s:当前打开的媒体上下文
  • int stream_index:要 seek 的流索引(如视频流索引)。-1 表示使用全局时间戳
  • int64_t timestamp:要 seek 到的时间戳,单位是流的 time_base(或 AV_TIME_BASE 如果 stream_index == -1)
  • int flags:控制 seek 行为的标志位(详见下)
    • AVSEEK_FLAG_BACKWARD : 往后找不到就往前找(向后 seek 时的安全保障)
    • AVSEEK_FLAG_BYTE : 用字节位置 seek(不基于时间戳)
    • AVSEEK_FLAG_ANY : 允许 seek 到非关键帧(否则只能 seek 到关键帧)
    • AVSEEK_FLAG_FRAME : 使用帧编号作为 timestamp(不常用)
  • 返回值:0:成功, < 0:失败(格式不支持 seek、找不到目标、参数错等)

2、av_seek_frame 内部流程

2.1 av_seek_frame() 直接调用 avformat_seek_file()

兼容性包装,直接转调。

2.2 seek_frame_internal()

先尝试使用索引(AVStream->index_entries)做时间戳二分查找。如果不能用 index seek,会调用 demuxer 的 read_seek() / read_seek2() 回调

2.3 ff_seek_frame_binary()

通过 AVStream->index_entries(解复用器生成的 seek index,比如 .ts、.mp4 中的 moov atom 或 PTS 索引)进行二分查找。到合适关键帧的 offset

2.4 fallback

AVInputFormat->read_seek() / read_seek2()每种格式实现自己的跳转策略(比如 MPEG-TS 中的 PAT/PMT 结构)

3、av_seek_frame 调用流程图

相关推荐
wljy18 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
云泽8088 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
君为先-bey8 小时前
CogVideoX——Transformer从文本到视频的扩散模型
深度学习·音视频·transformer·扩散模型
Raink老师9 小时前
【AI面试临阵磨枪-77】音视频 + AI:实时字幕、翻译、降噪、虚拟人、多模态对话
人工智能·面试·音视频
繁华落尽,倾城殇?9 小时前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
代码村新手9 小时前
C++-二叉搜索树
开发语言·c++
FrameNotWork10 小时前
HarmonyOS 短视频滑动交互实现:打造流畅的上下切换体验
音视频·交互·harmonyos
智者知已应修善业10 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业10 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
做萤石二次开发的哈哈12 小时前
ERTC-产品介绍-应用场景
音视频·实时音视频