音视频日记 - ffmpeg 之 IO 架构分析
协议 (文件) 操作的顶层结构是 AVIOContext
,该对象实现了带缓冲的读写操作
协议 (文件) 操作的顶层结构是 AVIOContext
,该对象实现了带缓冲的读写操作
「先穿袜子,再穿鞋子」 --- 这就是一种拓扑排序
AVFormatContext
: 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息AVInputFormat
: 每种封装格式(例如 FLV, MKV, MP4, AVI)对应一个该结构体AVStream
: 视频文件中每个视频(音频)流对应一个该结构体AVCodecContext
: 编码器上下文结构体,保存了视频(音频)编解码相关信息AVCodec
: 每种视频(音频)编解码器 (例如 H.264 解码器) 对应一个该结构体AVPacket
: 存储一帧压缩编码数据AVFrame
: 存储一帧解码后像素(采样)数据ffmpeg
是一个基于 ffmpeg
库的经典转码程序,几乎被所有的知名系统、软件工具、服务器后台等静默使用,通过命令行启动转码,这里主要以命令行语法讲解为主。
YUV
是一种彩色编码系统,主要用在视频、图形处理流水线中 (pipeline)。相对于 RGB 颜色空间,设计 YUV
的目的就是为了编码、传输的方便,减少带宽占用和信息出错。
人眼的视觉特点是对亮度更铭感,对位置、色彩相对来说不铭感。在视频编码系统中为了降低带宽,可以保存更多的亮度信息 (luma),保存较少的色差信息 (chroma)。
在 Windows
上编译 ffmpeg
没有在 linux
上简单方便,在此记录编译过程
为了支持定时器,libevent
必须和系统时间打交道,z 在 event_add
时,用户制定了一个超时时间,这个超时时间是一个相对时间,但在 event_add
函数内部,libevent
将其转换为了绝对时间,这就带来了一个问题:在系统时间改变时,libevent
需要修改 event
的绝对时间,为此 libevent
内部有以下几种解决方案:
monotonic time
fake monotonic time
event_base
允许用户对它里面的 event
设置优先级,这样可以使得有些更重要的 event
能够得到优先处理。
由于最近更换电脑,需要将旧电脑的一些资料转移至新电脑,其中 Hexo
的资料转移过程中踩了不少坑,所以在此记录以下,防止后续换机时继续踩坑。
mp4
文件封装格式,对应的标准为 ISO/IEC 14496-12
和 ISO/IEC 14496-14
。
ISO/IEC 14496-12
定义了一种封装媒体数据的基础文件格式,mp4
、3gp
、ismv
等我们常见媒体封装格式都是以这种基础文件格式为基础衍生的。
ISO/IEC 14496-14
基于 ISO-14496-12
定义了 mp4
文件格式。
文章 音视频封装 - TS 封装格式 中分析了 TS
流的结构,本文通过一段真实的码流的分析来加强对 TS
流结构的理解。
注 1:本文中的
TS
码流截取自一段从网络下载的网络视频
TS
全称是 MPEG2-TS
,MPEG2-TS
是一种标准容器格式,传输与存储音视频、节目与系统信息协议数据,广泛应用于数字广播系统,我们日常数字机顶盒接收到的就是 TS
(Transport Stream
,传输流)流。
Vim 是从 vi 发展出来的一个文本编辑器,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。
HLS
全称是 HTTP Live Streaming
,是一个由 Apple
公司提出的基于 HTTP
的媒体流传输协议,用于实时音视频流的传输。目前 HLS
协议被广泛的应用于视频点播和直播领域。
内存泄漏一般是由于程序在堆上分配了内存而没有释放,随着程序的运行占用的内存越来越大,一方面会影响程序的稳定性,可能让运行速度越来越慢,或者造成 OOM
,甚至会影响程序所运行的机器的稳定性,造成宕机。
而分析内存问题的常用工具有 valgrind
和 gperftools
等,当然也可以自行开发钩子函数,本文主要介绍 gperftools
来进行内存泄漏的分析。