FFmpeg笔记(一)-- 简介
简介
FFmpeg是一套可以用来记录、处理数字 音频、视频,并将其转换为流的开源框架,采用LPL或GPL许可证,提供了录制、转换以及流化音视频的完整解决方案。它的可移植性或者说跨平台特性非常强大,可以用在Linux服务器、PC(包括Windows、 Mac OS X等)、移动端设备(Android、iOS等移动设备)等平台。名称中的mpeg来自视频编码标准MPEG,而前缀FF是Fast Forward的首字母缩写。
安装
FFmpeg
pod安装(github上的版本比较老,需要最新版本手动去官网下载吧):
pod 'FFmpeg'
手动安装要执行脚本,比较繁琐,自行查找吧,比如 这个,亲测可行。需要注意的是无论手动安装还是pod安装都需要添加关联的系统库(各个版本导入的库可能不一样):
libz.tbd
libbz2.tbd
libiconv.tbd
AudioToolbox.framework
CoreMedia.framework
VideoToolbox.framework
AVFoundation.framework
x264
资源包
执行脚本
将【build-x264.sh】脚本文件放到和资源包同一级目录下,并将资源包名称改为【x264】(这里是为了和脚本内容匹配,具体可以打开脚本文件看【SOURCE】字段的赋值)。
如果报错【No working C compiler found.】执行以下代码:
//如果是i386报这个错直接打开脚本删掉【ARCHS="arm64 x86_64 i386 armv7 armv7s"】中的i386
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
执行完后的【x264-iOS】就是最终的iOS库。
结构
FFmpeg结构图.pngFFmpeg分为3个命令行工具(笔记二有详细介绍),8个静态库如下:
libavutil:核心工具库,该模块是最基础的模块之一,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。
common.h
,ffplay 使用的工具类数据类型定义,宏定义和两个简单的内联函数.
bswap.h
,short 和 int 整数类型字节顺序交换,通常和 CPU 大端或小端有关。
rational.h
,用两整数精确表示分数。常规的可以用一个 float 或 double 型数来表示分数,但不是精确表示,在需要相对比较 精确计算的时候,为避免非精确表示带来的计算误差,采用两整数来精确表示。
mathematics.h
,数学上的缩放运算。为避免计算误差,缩放因子用两整数表示做精确的整数运算。为防止计算溢出,强制转换为 int 64 位整数后计算。
avutil.h
,ffplay 基础工具库使用的一些常数和宏的定义。
libavformat:文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。
avformat.h
,定义识别文件格式和媒体类型库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相对全局有效。
allformats.c
,简单的注册/初始化函数,把相应的协议,文件格式,解码器等用相应的链表串起来便于查找。
cutils.c
,ffplay 文件格式分析模块使用的两个工具类函数,都是对字符串的操作。
file.c
,ffplay 把 file 当做类似于 rtsp,rtp,tcp 等协议的一种协议,用 file:前缀标示 file 协议。 URLContext 结构抽象 统一表示这些广义上的协议,对外提供统一的抽象接口。 各具体的广义协议实现文件实现 URLContext 接口。此 文件实现了 file 广义协议的 URLContext 接口。
avio.h
,文件读写模块定义的数据结构和函数声明,ffplay 把这些全部放到这个.h 文件中。
avio.c
,此文件实现了 URLProtocol 抽象层广义文件操作函数,由于 URLProtocol 是底层其他具体文件 (file,pipe 等) 的简单封装,这一层只是一个中转站,大部分函数都是简单中转到底层的具体实现函数。
aviobuf.c
,有缓存的广义文件 ByteIOContext 相关的文件操作,比如 open,read,close,seek 等等。
utils_format.c
,识别文件格式和媒体格式部分使用的一些工具类函数。
avidec.c
,AVI 文件解析的相关函数。
注意 1:AVI 文件容器媒体数据有两种存放方式,非交织存放和交织存放。交织存放就是音视频数据以帧为最 小 连续单位,相互间隔存放,这样音视频帧互相交织在一起,并且存放的间隔没有特别规定;非交织存放就是把 单 一媒体的所有数据帧连续存放在一起,非交织存放的 avi 文件很少。
注意 2:AVI 文件索引结构 AVIINDEXENTRY 中的 dwChunkOffset 字段指示的偏移有的是相对文件开始字节的 偏 移,有的事相对文件数据块 chunk 的偏移。
注意 3:附带的 avi 测试文件是交织存放的。
libavcodec:编解码库,该模块也是最重要的模块之一,封装了 Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264、FDK-AAC、lame等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口。
avcodec.h
,定义编解码器库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相对全局有效。
allcodecs.c
,简单的注册/初始化函数,把编解码器用相应的链表串起来便于查找识别。
dsputil.h
,定义 dsp 优化限幅运算使用的查找表及其初始化函数。
dsputil.c
,定义 dsp 优化限幅运算使用的查找表,实现其初始化函数。
imgconvert_template.h
,定义并实现图像颜色空间转换使用的函数和宏。
imgconvert.c
,定义并实现图像颜色空间转换使用的函数和宏。
msrle.c
,此文件实现微软行程长度压缩算法解码器。
turespeech_data.h
,定义 true speed 音频解码器使用的常数。
turespeech.c
,实现 true speed 音频解码器。
utils_codec.c
,编解码库使用的帮助和工具函数。