博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg实战系列——001
阅读量:4634 次
发布时间:2019-06-09

本文共 1172 字,大约阅读时间需要 3 分钟。

Talk is cheap,Show me the code!

本文部分参考了雷神的博客,加入自己的理解,新增了对每种数据结构的详细剖析!

 

开始玩ffmpeg之前,先把ffmpeg中常见的数据结构以及他们的之间的关系了解下,这是基础,非常重要!

 

FFMPEG中结构体很多。最关键的结构体可以分成以下几类:

 

a)        解协议(http,rtsp,rtmp,mms):所有格式的协议组织成一个全局链表,使用时动态绑定到具体的某种协议,如:ff_file_protocol、ff_rtmp_protocol等

AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)

 

b)        解封装(flv,avi,rmvb,mp4):所有的demuxer,也叫AVInputFormat组织成一个全局链表,使用时动态绑定到具体的某种demuxer,如ff_flv_demuxer、ff_mpegts_demuxer、ff_avi_demuxer

AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。

AVInputFormat:demuxer

AVOutputFormat:muxer

 

c)        解码(h264,mpeg2,aac,mp3):所有的decoder、encoder组织成一个全局链表,使用时动态绑定到具体的某种编解码器,如:ff_h264_decoder、ff_hevc_decoder等

每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。

d) 存数据

视频的话,每个结构一般是存一帧;音频可能有好几帧

解码前数据:AVPacket

解码后数据:AVFrame

 

他们之间的对应关系如下所示:

 

 

 

分析了最新的3.3 ffmpeg后,得出如下数据关系:

先来看一下这几个数据结构,为方便格式直接上传图片:

 

 

 

 

上层调用具体格式时,函数调用的时候,第一个参数一定是:priv_data

所有的信息几乎都来自上下文结构体:priv_data

 掌握了以上数据结构就可以开始我们的ffmpeg实战代码分析了。

 

转载于:https://www.cnblogs.com/stnlcd/p/7149905.html

你可能感兴趣的文章
子分类账知识学习(汇总网上比较有用的资料)
查看>>
pyQt 每日一练习 -- 登录框
查看>>
wp 删除独立存储空间文件(多级非空文件夹删除)
查看>>
Loadrunner安装使用入门
查看>>
smartupload 上传文件时 把页面编码改成gbk 解决乱码
查看>>
EPS是什么格式
查看>>
input禁止显示历史输入记录
查看>>
Python的数据库操作(Sqlalchemy)
查看>>
2.抽取代码(BaseActivity)
查看>>
My simplified pickit2 clone
查看>>
Redis 入门知识
查看>>
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
转--Android如何在java代码中设置margin
查看>>
反射的所有api
查看>>
Js 判断网页窗口是否滚动到底部
查看>>
上传文件
查看>>
css 定位及遮罩层小技巧
查看>>
用java向mysql数据库中插入数据为空
查看>>
项目中非常有用并且常见的ES6语法
查看>>
dateTimePicker编辑状态下,取值不正确的问题
查看>>