1、FFmpeg初识:从命令行到音视频处理的瑞士军刀
说实话,我第一次接触FFmpeg是在一个视频转码项目里。甲方丢过来一堆各种格式的监控录像,要求统一转成MP4。我那时候还是个新手,对着几十个G的文件发愁。同事甩过来一行命令:ffmpeg -i input.avi output.mp4。跑完一看,成了。就这么简单。
但FFmpeg远不止转码这么简单。它是一整套音视频处理工具集,能做的事情多到你想象不到。我这些年做过的项目里,从直播推流、视频剪辑、音频降噪,到格式封装、字幕提取、画面裁剪,几乎都离不开它。
一句话总结:FFmpeg是一个开源、跨平台的音视频处理框架,能完成几乎所有你能想到的音视频操作——转码、封装、解封装、滤镜、流媒体、录制、播放……
1.1 FFmpeg到底是什么?
FFmpeg这个名字,拆开看就是「FF」(Fast Forward,快进)+「MPEG」(运动图像专家组)。说白了,它是一套用C语言写的音视频处理库,外加一堆命令行工具。核心开发者是法国程序员Fabrice Bellard——嗯,就是那个写QEMU和TinyCC的天才。
为什么说它是「瑞士军刀」?你想想看,音视频处理涉及的东西太多了:
- 不同的编码格式(H.264、H.265、VP9、AV1……)
- 不同的封装格式(MP4、MKV、AVI、FLV……)
- 不同的流媒体协议(RTMP、HLS、DASH……)
- 不同的音频编码(AAC、MP3、Opus……)
FFmpeg把这些全部统一了。你不需要关心底层细节,一条命令就能搞定。我在项目中经常遇到这种情况:甲方给了一个奇怪的格式,播放器打不开。我第一反应就是——扔给FFmpeg看看。
小提示:FFmpeg支持几乎所有你能想到的音视频格式。如果某个格式它不支持,那大概率是这个格式太冷门或者已经过时了。
1.2 核心组件:三大库撑起一片天
FFmpeg不是一个大而全的二进制文件,它由多个库组成。其中最重要的三个,我称之为「三驾马车」:
| 库名 | 全称 | 职责 | 我常用的场景 |
|---|---|---|---|
| libavformat | 音视频封装/解封装库 | 处理容器格式(MP4、MKV、FLV等),负责读取和写入音视频文件 | 分析文件结构、提取元数据、封装转换 |
| libavcodec | 音视频编解码库 | 处理编码和解码(H.264、AAC、MP3等) | 转码、硬件加速解码、编码参数调优 |
| libavutil | 工具库 | 提供基础工具函数(内存管理、数学运算、数据结构等) | 几乎所有其他库都依赖它 |
这三个库的关系,我画了一张图帮你理解:
除了这三个核心库,还有几个辅助库也很重要:
- libswscale:图像缩放、色彩空间转换。我在做视频缩略图生成时经常用到。
- libswresample:音频重采样、格式转换。比如把48kHz采样率转成44.1kHz。
- libavfilter:滤镜库。裁剪、旋转、添加水印、调整亮度……都靠它。
- libavdevice:设备输入输出。从摄像头采集、推流到设备,都归它管。
注意:libavutil虽然名字叫「工具库」,但它不是可有可无的。所有其他库都依赖它。如果你自己写代码调用FFmpeg的API,libavutil提供的日志、内存管理、数据结构会让你省很多事。
1.3 下载与安装:Windows / Mac / Linux
安装FFmpeg其实很简单。我这些年装过不下50次,踩过一些坑,下面把最稳的方法告诉你。
Windows
Windows下我推荐两种方式:
- 官方编译版(推荐):去FFmpeg官网下载Windows builds。选那个带
full字样的,包含所有组件。下载后解压,把bin目录加到系统环境变量PATH里。 - Chocolatey包管理器:如果你装了Chocolatey,一行命令搞定:
choco install ffmpeg
我个人习惯用第一种。为什么?因为官方编译版更新最快,而且你可以选择带或不带某些编码器。比如有些场景需要libx264编码器,官方版默认就带了。
避坑指南:我曾经在Windows上装过一些第三方打包的FFmpeg,结果发现缺少某些编码器,转码时直接报错。从那以后我只用官方编译版。
Mac
Mac用户最简单,用Homebrew:
brew install ffmpeg
如果你想装全一点,可以加上一些常用选项:
brew install ffmpeg --with-libvorbis --with-libvpx --with-x265
嗯,这里要注意:Homebrew默认的FFmpeg可能不带某些非自由编码器(比如libfdk_aac)。如果你需要,得用--with-fdk-aac参数。不过大多数场景下默认版够用了。
Linux
Linux下各发行版都有自己的包管理器:
| 发行版 | 安装命令 |
|---|---|
| Ubuntu / Debian | sudo apt install ffmpeg |
| CentOS / RHEL | sudo yum install ffmpeg(需先启用EPEL) |
| Fedora | sudo dnf install ffmpeg |
| Arch Linux | sudo pacman -S ffmpeg |
我在Ubuntu上装得最多。但要注意:apt仓库里的版本可能比较旧。如果你需要最新版,建议从源码编译或者用静态编译版。
注意:Linux下用包管理器安装的FFmpeg,有时候会缺少某些编码器(比如libx264)。如果你遇到Unknown encoder 'libx264'这种错误,说明你的FFmpeg没编译进这个编码器。解决办法是安装libx264-dev然后重新编译,或者直接用静态编译版。
1.4 验证安装:看看你的FFmpeg能不能干活
装完之后,第一件事就是验证。打开终端(Windows下是CMD或PowerShell),输入:
ffmpeg -version
如果看到类似这样的输出,说明安装成功了:
ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 13.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-nonfree ...
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 1.100 / 57. 1.100
注意看libavformat、libavcodec、libavutil这几行——这就是我们前面说的三大核心库。版本号能看到,说明它们都正常加载了。
接下来,我建议你再跑两个命令,确认编码器和封装器是否齐全:
ffmpeg -encoders | findstr /i "h264 aac" # Windows
ffmpeg -encoders | grep -i "h264\|aac" # Mac/Linux
如果输出里能看到libx264和aac,那恭喜你,最常用的编码器都有了。
快速测试:找一个你电脑上的视频文件(比如test.mp4),跑一下这条命令:
ffmpeg -i test.mp4 -c:v libx264 -c:a aac output.mp4
如果没报错,生成了output.mp4,那你的FFmpeg就能正常干活了。
最后,再提一个我常用的验证方式——看帮助信息:
ffmpeg -h full | less
这个命令会列出所有可用的选项、编码器、封装器、滤镜等。内容很长,但你可以快速扫一眼,看看有没有你关心的功能。比如我经常搜scale滤镜:
ffmpeg -h full | grep -i "scale"
如果搜到了,说明你的FFmpeg支持视频缩放功能。
小技巧:如果你发现某个功能没有,别急着重装。先看看是不是命令写错了,或者参数没加对。我遇到过好几次「假报错」——其实是自己把参数拼错了。
好了,到这里FFmpeg就装好了,也能跑了。下一章我们开始真正动手——用FFmpeg处理第一个视频文件。不过在那之前,建议你先熟悉一下命令行,随便找个视频文件试试ffprobe看看它的信息:
ffprobe -v quiet -print_format json -show_format -show_streams your_video.mp4
这条命令会以JSON格式输出视频的详细信息——编码格式、分辨率、码率、帧率、时长……嗯,这些数据在后面的课程里会反复用到。