《FFMPEG/FFPLAY 源码剖析》学习笔记(一)
《FFMPEG/FFPLAY 源码剖析》是由杨书良2011年于上海所著,作者博客地址:MCODEC,以及这本书籍的电子版下载地址。
注:原作者保留本电子书修改和正式出版的所有权利。最终读者可以自由复制和传播本电子书,但不得修改其内容,并且要保证内容的完整性。
1 目录
这段时间想要学习一下播放器的搭建,于是住准备开始学习播放器的“王者核心”——FFmpeg。师兄推荐了一本解读源码的大作——FFMPEG/FFPLAY 源码剖析,于是便开始了对这本书的大致探索。
最初整体一翻给我的感觉就像是正在看FFmpeg的API文档一样,从目录分模块份文件的形式上就感到了一股“技术字典”般浓浓的观感。全书除前言外总体分了五部分讲解作者眼中的FFmpeg的“灵魂”,分别是概述、libavutil、libavformat、libavcodec以及ffplay。总体分为了三个部分:原理介绍、代码介绍、项目示例。这样一看,这本“技术字典”好像还是很有可读性的。
2 概述
该部分主要讲解了ffplay源码的文件结构、播放原理、SDL的使用以及AVI格式封装和典型压缩算法的介绍。
-
首先是有关FFplay的总体结构,先大致对作者“提取”出的“灵魂”文件们有一个大致了解。
文件层次图
注:本处暂时没有按原书详细列出各个文件功能,详细内容会在下面部分给出,图中带有 “ * ” 的节点表示文件夹,没有星号也没有后缀的节点是.c/.h文件的合写。
-
播放器原理
各模块流程
播放器播放一般分为七个基本模块(过滤器),按广度顺序:读文件模块,解复用模块 ,视频解码模块,音频解码音频,颜色空间转换模块,视频显示模块,音频播放模块。
其中读文件模块是将文件不断以流的形式输送到后面的各个模块中。解复用模块主要作用就是识别文件的类型和媒体数据的格式(遍历),并针对类型做出一些简单的预处理,同时负责后续的时钟同步。后续的音视频解码模块主要任务就是解码数据包并传递时钟的同步信息,最终通过音视频播放模块根据同步信息播放出音画信息。颜色空间转换模块主要针对YUV与RGB两种数据的转换,根据不同要求进行输出。 -
FFplay播放器
FFplay本质上也遵循上述的播放流程:
读文件模块(libavformat):最底层是解协议(本地/tcp/udp/http/pipe/...),中间抽象层负责中转(URLContext),最上层实现读媒体文件功能(ByteIOContext)。
解复用模块(libavformat):底层是解复用结构(AVIContext/TCPContext/...),上层通过priv_data获取下层数据并分离出音视频裸数据(AVFormatContext)通过streams传递下去。
解码模块(libavcodec):可由AVCoder统一表述,上层是AVCoderContext相关的结构及基础程序,下层是具体解码器的结构和相关程序。
颜色空间转换模块(libavcodec):将解码出的YUV格式数据转换成目的系统支持的色彩格式。
渲染模块(SDL):调用SDL库进行音视频渲染播放。
ffplay.c文件:相当于 directShow里面的 GraphEdit,可以简单理解成一个支撑大平台,支撑大框架。它声明并 实例化其他的数据结构/模块,并且把其他数据结构/模块串联起来,最后把其他数据结构/模块关联到VideoState数据结构,同时控制程序的启动暂停停止等。 -
FFmpeg瘦身时的具体变动
1)只保留简单的两个压缩算法和avi格式
2)样例视频从神奇的321×321转压常见的320×320
3)删除不用支撑的文件格式和媒体编解码算法相关代码
4)删除不支持的平台相关代码
5)删除一些不用支撑的功能
6)写死某些参数又精简了很多函数的实现
7)把没有实际使用的几乎所有变量和函数也删掉了
8)为便于理解修改了部分函数命名
8)其他必要改动 -
ffplay框架详讲、AVI格式介绍、SDL使用及压缩算法介绍详见原书,不作赘述