1.4 FFmpeg的编解码工具ffmpeg
1.4 FFmpeg的编解码工具ffmpeg
ffmpeg
是FFmpeg
源代码编译后生成的一个可执行程序,其可以作为命令行工具使用。本节将通过实际的示例分析,对ffmpeg
编解码工具的使用方法进行详细的介绍。
首先列举一个简单的例子:
1 | ./ffmpeg -i input.mp4 output.avi |
这条命令行执行过程输出如下:
这是一条简单的ffmpeg
命令,可以看到,ffmpeg
通过-i参数将input.mp4
作为输入源输入,然后进行转码与转封装操作,输出到output.avi
中,这条命令主要做了如下工作。
- 获得输入源
input.mp4
。 - 转码。
- 输出文件
output.avi
。
看似简单的两步主要的工作,其实远远不止是从后缀名为MP4
的文件输出成后缀名为AVI
的文件,因为在ffmpeg
中,MP4
与AVI
是两种文件封装格式,并不是后缀名就可以决定的,例如上面的命令行同样可以写成这样:
1 | ./ffmpeg -i input.mp4 -f avi output.dat |
这条命令行执行过程输出如下:
这条ffmpeg
命令相对于前面的那条命令做了一些改变,加了一个"-f"
进行约束,"-f"
参数的工作非常重要,它制定了输出文件的容器格式,所以可以看到输出的文件为output.dat
,文件后缀名为.dat
,但是其主要工作依然与之前的指令相同。
分析以上两个输出信息中的Output#0
部分,可以看到输出的都是AVI
,只是输出的文件名不同,其他内容均相同。ffmpeg
的主要工作流程相对比较简单,具体如下。
- 解封装(
Demuxing
)。 - 解码(
Decoding
)。 - 编码(
Encoding
)。 - 封装(
Muxing
)。
其中需要经过6个步骤,具体如下。
- 读取输入源。
- 进行音视频的解封装。
- 解码每一帧音视频数据。
- 编码每一帧音视频数据。
- 进行音视频的重新封装。
- 输出到目标。
ffmpeg
整体处理的工作流程与步骤如图1-4所示。
从图1-4所示的工作流程可以看出,ffmpeg
首先读取输入源;
然后通过Demuxer
将音视频包进行解封装,这个动作通过调用libavformat
中的接口即可实现
;接下来通过Decoder
进行解码,将音视频通过Decoder
解包成为YVU
或者PCM
这样的数据,Decoder
通过libavcodec
中的接口即可实现;
然后通过Encoder
将对应的数据进行编码,编码可以通过libavcodec
中的接口来实现;
接下来将编码后的音视频数据包通过Muxer
进行封装,Muxer
封装通过libavformat
中的接口即可实现,输出成为输出流。