FFmpeg从入门到精通
上QQ阅读APP看书,第一时间看更新

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中的接口即可实现,输出成为输出流。