跳到主要内容

FFmpeg基本工作流程及语法概念

基本工作流程

基本语法概念

安装 FFMPEG 后,只需在终端上输入ffmpeg即可运行该程序。 FFMPEG 的基本流程非常直观。看下面这个非常基本的例子。

获取.wav格式的音频文件(例如:mysong.wav)并将其转换为 Mp3 音频文件,因此创建一个名为mysong.mp3的新文件。 假设文件mysong.wav已经在当前工作目录中,输入如下命令:

ffmpeg -i mysong.wav mysong.mp3

-i表示Input。 此输入可以是计算机中的本地文件,也可以是来自远程 URL 的文件。

在输出文件末尾指定的文件扩展名将使 FFMPEG 自动选择 Mp3 格式,并为该类型的文件提供一些最佳选项。 但是如果同时处理许多视频或不同的音频文件可能比这更复杂一些。 可能希望为该 mp3 输出选择特定的比特率,或者您的WAV 文件可能需要在转换发生之前进行预处理,例如使用标准响度归一化滤波器:

ffmpeg -i mysong.wav -af loudnorm -c:a mp3 -b:a 256k -ar 48000 mysong.mp3

这将采用相同的原始文件,但这次它将对其进行处理,然后将其转换为 mp3 文件:

ffmpeg -i mysong.wav:将处理输入文件mysong.wav

-af loudnorm :将应用Audio Filter Loudnorm,它将执行标准音频响度归一化

-c:a mp3:表示Codec Audio mp3。 此选项将指定我们要导出 mp3 文件

-b:a 256k:表示Bitrate of the Audio,将生成一个比特率为256 Kbit/s的音频文件

-ar 48000:表示Audio Rate。 此选项将进一步指定我们要创建具有特定音频采样率(在本例中为 48000 KHz)的输出文件。

相同的语法结构适用于视频文件。 举个例子:Apple ProRes 文件master.mov必须转换为h264:

ffmpeg -i master.mov master.mp4

输出文件上使用的扩展名将触发 FFMPEG 的几个默认选项,以便在 mp4 容器中生成高质量的 h264 文件。 但是我们可能想要一个更小的文件或一个特定的音频选项,或者可能需要从5.1音轨进行立体声缩混,或者我们可能想对一个3个小时的URL视频仅处理和输出其前2分30秒 :

ffmpeg -i https://www.dropbox.com/master.mov -t 00:02:30 -c:v h264 -b:v 3M -c:a aac -b:a 128k -ar 44100 -ac 2 master.mp4

-i:表示Input

-t:表示仅处理该指定时间段的数据

-c:v:表示Codec Video

-b:v:表示Video Bitrate,即每秒所需的视频数据量,以兆比特(Megabit)表示

-c:a:表示Audio Codec

-b:a:表示Audio Bitrate,即每秒所需的音频数据量,以千比特(kilobit)表示

-ar:表示Audio Rate,也称为采样率(Sampling Rate)。样本是在该音轨中对某个特定时间的测量,快照(Snapshot)。例如用1和0的二进制语言描述。 每秒重复该测量数万次; 采集快照的频率表示采样率或采样频率,以千赫兹(kiloHertz)为单位,单位表示每秒1000 次。 例如,音频 CD 的采样率为 44.1kHz,这意味着每秒对模拟信号进行44100次采样。

-ac 2:表示2 Audio Channels (Left+Right) 。当必须对包含多个音轨的音频文件进行混音(down-mix)时,例如Dolby Surround 5.1/7.1或其它类似音轨,那么此选项将很有用,

帮助命令的自解释能力

ffmpeg -hffmpeg -pix_fmts 这类帮助命令本身就很有价值。遇到“支持什么格式、选项叫什么、参数范围是多少”这类问题,先查帮助,再去搜资料。

像素格式和色彩空间的含义参见 常见的图片颜色编码;源码编译和调试参见 FFmpeg编译及调试

设备接入

在 Windows 下打开 USB 摄像头,通常走 dshow。录制、预览、推流这三类动作最好分开记,不要堆成一段长命令,否则过后自己也看不懂。

日志接管

嵌入式或桌面程序集成 FFmpeg 时,av_log_set_callback() 是一个很实用的接入点。核心目标不是“把所有日志都打出来”,而是把严重级别、模块归属和现有日志系统接起来。

滤镜 API 的核心模型

libavfilter 的核心不是某个具体特效,而是 Filter Graph

  • 输入端一般是 buffer
  • 中间是功能性 filter
  • 输出端一般是 buffersink

想清楚这个模型之后,无论是 scaleoverlaydrawtext 还是音频重采样,本质上都是在图里插节点。

与 GStreamer 的关系

GStreamer 更像一套完整的多媒体框架,而不是单纯的命令行工具,真正开始用它时必须以官方文档为主,再结合具体平台资料(例如 Rockchip 的平台说明)。如果问题已经落到某个厂商提供的二进制库或图像加速库符号缺失,那重点就不是 GStreamer 语法,而是平台依赖和运行时库版本。