ffmpeg 自定义IO与Seek
AvIOContext
AVIOContext
先看此上下文结构体中一些重要的属性:
avio.h 中关于 io 上下文 buffer 主要概念的图示: avio_alloc_context()方法签名:
这几个参数分别对应了上面结构体介绍中的对应属性,看实际使用流程: io 上下文使用流程
参数介绍: opaque: 指向 自定义 BufferData 结构体的实例,因为要从视频 buffer 数据中不断通过 read_packet 读数据到 io 上下文小 buffer。 buf: io 上下文小 buffer 的开始位置,也就是上面定义的 buf_size: 就是 io 上下文小 buffer 的大小,如上定义的
至此,就通过自定义 io 上下文,让 AVFormatContext 可以解封装提供的视频 buffer 数据了,之后的解封装、解码流程和不使用 io 上下文一样 seek
ffmpeg 中 seek 功能通过 av_seek_frame()方法来进行
AVIOContext 自定义 seek 函数
回调签名:
参数介绍: opaque: 同 read_packet 回调,原始视频 buffer 信息的结构体 offset: 要 seek 到的位置,可以是相对原始视频的起始位置,可以是相对 io 上下文小 buffer 的起始位置,取决于 whence whence: seek 的类型,取值为 AVSEEK_SIZE 、SEEK_CUR 、SEEK_SET、SEEK_END, AVSEEK_SIZE: 不进行 seek 操作,而是要求返回 视频 buffer 的长度大小 SEEK_CUR: 表示 offset 是相对 io 上下文小 buffer 开始位置的 SEEK_SET: 表示 offset 是相对 原始 buffer 开始位置的 SEEK_END: 表示 offset 是相对 原始 buffer 结束位置的
所以自定义 io seek 函数实现如下即可:
精准 seek av_seek_frame 要想不花屏需要设置 flag 对于 mp4 格式没毛病,seek 到里指定 pts 之前最近的关键帧,然后开始解码,从关键帧到指定的 pts 之前的视频帧可以手动丢弃,然后从指定 pts 位置开始展示 对于 ts 格式效果就没那么好,av_seek_frame() 对 ts 是会精确的 seek 到指定的 pts 位置的,但找不到 pts 之前最近的关键帧,指定 AVSEEK_FLAG_BACKWARD 也不行,效果就是: 从指定的 pts 位置开始解码,花屏直到遇到下一个关键帧,对于单个 ts 分片,只在开头有一个关键帧的这种,seek 后可能从指定的 pts 位置开始直接全部解码失败了。测试对一个 ts 文件 通过 ffplay 最后,av_seek_frame()后需要刷新解码器上下文
|
ffmpeg 自定义IO与Seek相关推荐
- ffmpeg的IO操作
ffmpeg的IO操作主要在libavformat库中实现,部分实现用到了libavutl中的工具.网上有一些介绍ffmpeg的IO的文章,但是有些比较老了,并且一些现在ffmpeg结构已经一些变化, ...
- JAVA IO - RandomAccessFile Seek学习
2019独角兽企业重金招聘Python工程师标准>>> JAVA IO - RandomAccessFile Seek学习 import java.io.RandomAccessFi ...
- Ffmpeg 定位文件(seek file)
有朋友问到ffmpeg播放文件如何定位问题,我想到应该还有一些新手朋友对这一块比较陌生.ffmpeg定位问题用到seek方法,代码 如下: void SeekFrame(AVFormatContext ...
- ffmpeg自定义编解码器
小结 avdeviceffmpeg自定义输出设备OPENGL avcodecffmpeg自定义字节流转换器MJPEG2JPEG avcodecffmpeg自定义硬件加速解码器videotoolbox ...
- Arduino ESP8266 自定义IO组网页状态显示与控制-改版
Arduino ESP8266/32 自定义IO组网页状态显示与控制-改版
- ffmpeg 自定义数据来源, 可以是文件,可以是内存,可以是网络, 爱咋的咋的...
2019独角兽企业重金招聘Python工程师标准>>> // ffmpeg_custom_context.cpp : Defines the entry point for the ...
- 小乌龟奔跑的无聊日记~
2022-1-15 13:34 很开心,终于实现了自由人,近一年没有上班了,加油!加油!再定个3年目标,争取当一个不大不小的老板!骚年加油! 2021-3-24 20:44 很久不讲自己了,目前已从鲁 ...
- FFmpeg源码分析:AVIOContext、IO模型与协议
FFmpeg的IO模型从avio_open()方法开始,核心结构体由AVIOContext和URLProtocol组成.如果需要读取缓冲区buffer数据进行播放,可以通过自定义AVIOContext ...
- Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长(File文件方式)
ffmpeg系列 Java使用FFmpeg(自定义cmd) Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长 Java使用FFmpeg(自定义cmd)系列之官方API获取视频/音频信息 ...
- 深聊性能测试,从入门到放弃之:如何对IO进行性能调优
1.引言 2. 硬盘知识 2.1 磁盘原理 2.2 磁盘接口 2.3 磁盘读写 2.4 磁盘KPI 2.5 计算 2.5.1 IOPS计算 2.5.2 传输速率/吞吐率计算 2.6 IO延时 2.6. ...
最新文章
- FSMC(STM32)
- P5236-[模板]静态仙人掌【tarjan,LCA】
- 35岁前需要完成的事
- 使用AVPlayer制作一个播放器
- 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
- JAVA实现杨辉三角的三种方式
- 倍福PLC_添加CX2500-0060以太网模块后无法从TwinCAT软件扫描到问题
- 为什么正定矩阵等于转置_线性代数28——对称矩阵及正定矩阵,正定性
- u盘量产linux pe,WinPE U盘量产ISO
- 银行IT系统 -整体架构
- 学习笔记——最小生成树
- AlertManager警报通知 E-mail 微信 模板
- python100天发音_GitHub - hhttss999/Python-100-Days: Python - 100天从新手到大师
- PreparedStatement操作Blob类型的变量报错
- centos 7 开启80,443端口
- SuperMap iDesktopX 影像/栅格数据不用导入导出即可分析处理啦!
- pip异常No module named ‘pip‘处理方法
- java多音字首字母排序
- 痛快 SpringBoot终于禁掉了循环依赖
- jvm探秘五:Class类文件结构之属性表
热门文章
- conda:未找到命令的解决方法
- Xcode8去除控制台多余打印
- 树莓派——4G网卡华为ME909s-821 4G上网及开机自启动(1)
- python自然语言处理第三章:处理原始文本
- java多态性表现在哪两个方面_Java的多态性主要表现在______、______和______三个方面。...
- 洛谷P2386放苹果
- html当前页面的脚本发生错误,如何解决“当前页面脚本发生错误”的问题
- 如何缩减XFS分区格式的根目录
- [Java Framework] SpringBoot几种启动后自动初始化的几种方式
- 读书笔记(十五)--将才