一.ffmpeg详细描述
1.ffmpeg详细转码过程
_______ ______________
| | | |
| 输入| 分路器| 编码数据| 解码器
| 文件| ---------> | 数据包| ----- +
| _______ | | ______________ | |
v
_________
| |
| 解码|
| 框架|
| _________ |
________ ______________ |
| | | | |
| 输出| <-------- | 编码数据| <---- +
| 文件| muxer | 数据包| 编码器
| ________ | | ______________ |
| | | |
| 输入| 分路器| 编码数据| 解码器
| 文件| ---------> | 数据包| ----- +
| _______ | | ______________ | |
v
_________
| |
| 解码|
| 框架|
| _________ |
________ ______________ |
| | | | |
| 输出| <-------- | 编码数据| <---- +
| 文件| muxer | 数据包| 编码器
| ________ | | ______________ |
ffmpeg
调用libavformat库(包含demuxers)来读取输入文件并获取包含编码数据的数据包。当有多个输入文件时,ffmpeg
通过追踪任何活动输入流上的最低时间戳,尝试保持它们的同步。
然后将编码的数据包传送给解码器。解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过滤波进一步处理(见下一节)。在过滤之后,帧被传递给编码器,编码器对其进行编码并输出编码的数据包。最后,这些传递给复用器,将编码的数据包写入输出文件。
2.过滤
编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧,几个链式过滤器形成一个过滤器图形。ffmpeg区分两种类型的过滤器图:简单和复杂。
A.简单的过滤图
_________ ______________
| | | |
| 解码| | 编码数据|
| 框架| \ _ | 数据包|
| _________ | \ / || ______________ |
\ __________ /
简单_ \ || | /编码器
filtergraph | 过滤| /
| 框架|
| __________ |
| | | |
| 解码| | 编码数据|
| 框架| \ _ | 数据包|
| _________ | \ / || ______________ |
\ __________ /
简单_ \ || | /编码器
filtergraph | 过滤| /
| 框架|
| __________ |
简单的过滤图是使用每个流配置的 -过滤 选项与(-vf 和-af视频和音频别名)。一个简单的视频filtergraph可以看起来像这样子的例子
_______ _____________ _______ ________
| | | | | | | |
| 输入| ---> | 去隔行| ---> | 规模| ---> | 输出|
| _______ | | _____________ | | _______ | | ________ |
| | | | | | | |
| 输入| ---> | 去隔行| ---> | 规模| ---> | 输出|
| _______ | | _____________ | | _______ | | ________ |
B.复杂的过滤图
复杂的过滤器图是哪些不能简单描述为应用于一个流的线性处理链的过滤图。例如,当图形有多个输入和/或输出,或者当输出流类型和输入不同时,这种情况,可以用下图表示:
_________
| |
| 输入0 | \ __________
| _________ | \ | |
\ _________ / | 输出0 |
\ | | / | __________ |
_________ \ | 复杂| /
| | | | /
| 输入1 | ----> | 过滤| \
| _________ | | | \ __________
/ | 图| \ | |
/ | | \ | 输出1 |
_________ / | _________ | | __________ |
| | /
| 输入2 | /
| _________ |
| |
| 输入0 | \ __________
| _________ | \ | |
\ _________ / | 输出0 |
\ | | / | __________ |
_________ \ | 复杂| /
| | | | /
| 输入1 | ----> | 过滤| \
| _________ | | | \ __________
/ | 图| \ | |
/ | | \ | 输出1 |
_________ / | _________ | | __________ |
| | /
| 输入2 | /
| _________ |