前言
FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。
本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用 ffmpeg 提供的工具来处理音视频文件。
FFMPEG 目录及作用
· libavcodec: 提供了一系列编码器的实现。
· libavformat: 实现在流协议,容器格式及其本IO访问。
· libavutil: 包括了hash器,解码器和各利工具函数。
· libavfilter: 提供了各种音视频过滤器。
· libavdevice: 提供了访问捕获设备和回放设备的接口。
· libswresample: 实现了混音和重采样。
· libswscale: 实现了色彩转换和缩放工能。
FFMPEG基本概念
在讲解 FFMPEG 命令之前,我们先要介绍一些音视频格式的基要概念。
· 音/视频流
在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里边可以选择粤语或国语声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。
· 容器
我们一般把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。
· channel
channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。
FFMPEG 命令
我们按使用目的可以将 FFMPEG 命令分成以下几类:
· 基本信息查询命令
· 录制
· 分解/复用
· 处理原始数据
· 滤镜
· 切割与合并
· 图/视互转
· 直播相关
除了 FFMPEG 的基本信息查询命令外,其它命令都按下图所示的流程处理音视频。
然后将编码的数据包传送给解码器(除非为数据流选择了流拷贝,请参阅进一步描述)。 解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过滤波进一步处理(见下一节)。 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。 最后,这些传递给复用器,将编码的数据包写入输出文件。
默认情况下,ffmpeg只包含输入文件中每种类型(视频,音频,字幕)的一个流,并将其添加到每个输出文件中。 它根据以下标准挑选每一个的“最佳”:对于视频,它是具有最高分辨率的流,对于音频,它是具有最多channel的流,对于字幕,是第一个字幕流。 在相同类型的几个流相等的情况下,选择具有最低索引的流。
您可以通过使用-vn / -an / -sn / -dn选项来禁用某些默认设置。 要进行全面的手动控制,请使用-map选项,该选项禁用刚描述的默认设置。
下面我们就来详细介绍一下这些命令。
基本信息查询命令
FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:
参数 | 说明 |
---|---|
-version | 显示版本。 |
-formats | 显示可用的格式(包括设备)。 |
-demuxers | 显示可用的demuxers。 |
-muxers | 显示可用的muxers。 |
-devices | 显示可用的设备。 |
-codecs | 显示libavcodec已知的所有编解码器。 |
-decoders | 显示可用的解码器。 |
-encoders | 显示所有可用的编码器。 |
-bsfs | 显示可用的比特流filter。 |
-protocols | 显示可用的协议。 |
-filters | 显示可用的libavfilter过滤器。 |
-pix_fmts | 显示可用的像素格式。 |
-sample_fmts | 显示可用的采样格式。 |
-layouts | 显示channel名称和标准channel布局。 |
-colors | 显示识别的颜色名称。 |
接下来介绍的是 FFMPEG 处理音视频时使用的命令格式与参数。
命令基本格式及参数
下面是 FFMPEG 的基本命令格式:
ffmpeg [global_options] {[input_file_options] -i input_url} …
{[output_file_options] output_url} …
ffmpeg 通