1.4 FFmpeg的编解码工具ffmpeg

1.4 FFmpeg的编解码工具ffmpeg

ffmpegFFmpeg源代码编译后生成的一个可执行程序,其可以作为命令行工具使用。本节将通过实际的示例分析,对ffmpeg编解码工具的使用方法进行详细的介绍。
首先列举一个简单的例子:

1
./ffmpeg -i input.mp4 output.avi

这条命令行执行过程输出如下:

这是一条简单的ffmpeg命令,可以看到,ffmpeg通过-i参数将input.mp4作为输入源输入,然后进行转码与转封装操作,输出到output.avi中,这条命令主要做了如下工作。

  1. 获得输入源input.mp4
  2. 转码。
  3. 输出文件output.avi

看似简单的两步主要的工作,其实远远不止是从后缀名为MP4的文件输出成后缀名为AVI的文件,因为在ffmpeg中,MP4AVI是两种文件封装格式,并不是后缀名就可以决定的,例如上面的命令行同样可以写成这样:

1
./ffmpeg -i input.mp4 -f avi output.dat

这条命令行执行过程输出如下:

这条ffmpeg命令相对于前面的那条命令做了一些改变,加了一个"-f"进行约束,"-f"参数的工作非常重要,它制定了输出文件的容器格式,所以可以看到输出的文件为output.dat,文件后缀名为.dat,但是其主要工作依然与之前的指令相同。
分析以上两个输出信息中的Output#0部分,可以看到输出的都是AVI,只是输出的文件名不同,其他内容均相同。
ffmpeg的主要工作流程相对比较简单,具体如下。

  1. 解封装(Demuxing)。
  2. 解码(Decoding)。
  3. 编码(Encoding)。
  4. 封装(Muxing)。

其中需要经过6个步骤,具体如下。

  1. 读取输入源。
  2. 进行音视频的解封装。
  3. 解码每一帧音视频数据。
  4. 编码每一帧音视频数据。
  5. 进行音视频的重新封装。
  6. 输出到目标。

ffmpeg整体处理的工作流程与步骤如图1-4所示。

从图1-4所示的工作流程可以看出,
ffmpeg首先读取输入源;
然后通过Demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现
;接下来通过Decoder进行解码,将音视频通过Decoder解包成为YVU或者PCM这样的数据,Decoder通过libavcodec中的接口即可实现;
然后通过Encoder将对应的数据进行编码,编码可以通过libavcodec中的接口来实现;
接下来将编码后的音视频数据包通过Muxer进行封装,Muxer封装通过libavformat中的接口即可实现,输出成为输出流。