1.4 FFmpeg的编解码工具ffmpeg
ffmpeg是FFmpeg源代码编译后生成的一个可执行程序,其可以作为命令行工具使用。本节将通过实际的示例分析,对ffmpeg编解码工具的使用方法进行详细的介绍。
首先列举一个简单的例子:
./ffmpeg -i input.mp4 output.avi
这条命令行执行过程输出如下:
Input #0, mov, mp4, m4a,3gp,3g2, mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 1 compatible_brands: isomavc1 creation_time : 2015-02-02T18:19:19.000000Z Duration: 00:45:02.06, start: 0.000000, bitrate: 2708 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x714 [SAR 1:1 DAR 640:357], 2576 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default) Metadata: creation_time : 2015-02-02T18:19:19.000000Z handler_name : GPAC ISO Video Handler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default) Metadata: creation_time : 2015-02-02T18:19:23.000000Z handler_name : GPAC ISO Audio Handler Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> mpeg4 (native)) Stream #0:1 -> #0:1 (aac (native) -> ac3 (native)) Press [q] to stop, [? ] for help Output #0, avi, to 'output.avi': Metadata: major_brand : isom minor_version : 1 compatible_brands: isomavc1 ISFT : Lavf57.71.100 Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p (progressive), 1280x714 [SAR 1:1 DAR 640:357], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default) Metadata: creation_time : 2015-02-02T18:19:19.000000Z handler_name : GPAC ISO Video Handler encoder : Lavc57.89.100 mpeg4 Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 Stream #0:1(und): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s (default) Metadata: creation_time : 2015-02-02T18:19:23.000000Z handler_name : GPAC ISO Audio Handler encoder : Lavc57.89.100 ac3 frame= 786 fps=111 q=31.0 size= 5187kB time=00:00:31.71 bitrate=1340.1kbits/s speed=4.47x
这是一条简单的ffmpeg命令,可以看到,ffmpeg通过-i参数将input.mp4作为输入源输入,然后进行转码与转封装操作,输出到output.avi中,这条命令主要做了如下工作。
1)获得输入源input.mp4。
2)转码。
3)输出文件output.avi。
看似简单的两步主要的工作,其实远远不止是从后缀名为MP4的文件输出成后缀名为AVI的文件,因为在ffmpeg中,MP4与AVI是两种文件封装格式,并不是后缀名就可以决定的,例如上面的命令行同样可以写成这样:
./ffmpeg -i input.mp4 -f avi output.dat
这条命令行执行过程输出如下:
Input #0, mov, mp4, m4a,3gp,3g2, mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 1 compatible_brands: isomavc1 creation_time : 2015-02-02T18:19:19.000000Z Duration: 00:45:02.06, start: 0.000000, bitrate: 2708 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x714 [SAR 1:1 DAR 640:357], 2576 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default) Metadata: creation_time : 2015-02-02T18:19:19.000000Z handler_name : GPAC ISO Video Handler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default) Metadata: creation_time : 2015-02-02T18:19:23.000000Z handler_name : GPAC ISO Audio Handler Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> mpeg4 (native)) Stream #0:1 -> #0:1 (aac (native) -> ac3 (native)) Press [q] to stop, [? ] for help Output #0, avi, to 'output.dat': Metadata: major_brand : isom minor_version : 1 compatible_brands: isomavc1 ISFT : Lavf57.71.100 Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p (progressive), 1280x714 [SAR 1:1 DAR 640:357], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default) Metadata: creation_time : 2015-02-02T18:19:19.000000Z handler_name : GPAC ISO Video Handler encoder : Lavc57.89.100 mpeg4 Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 Stream #0:1(und): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s (default) Metadata: creation_time : 2015-02-02T18:19:23.000000Z handler_name : GPAC ISO Audio Handler encoder : Lavc57.89.100 ac3 frame= 711 fps=108 q=31.0 size= 4678kB time=00:00:28.83 bitrate=1329.0kbits/s speed= 4.4x
这条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)输出到目标。
图1-4 ffmpeg转码工作流程
ffmpeg整体处理的工作流程与步骤如图1-4所示。
从图1-4所示的工作流程可以看出,ffmpeg首先读取输入源;然后通过Demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现;接下来通过Decoder进行解码,将音视频通过Decoder解包成为YVU或者PCM这样的数据,Decoder通过libavcodec中的接口即可实现;然后通过Encoder将对应的数据进行编码,编码可以通过libavcodec中的接口来实现;接下来将编码后的音视频数据包通过Muxer进行封装,Muxer封装通过libavformat中的接口即可实现,输出成为输出流。