音视频日记 - 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 timefake monotonic timeevent_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 来进行内存泄漏的分析。