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 工具库 提供基础工具函数(内存管理、数学运算、数据结构等) 几乎所有其他库都依赖它

这三个库的关系,我画了一张图帮你理解:

FFmpeg 核心组件架构图 FFmpeg / ffplay / ffprobe libavformat 封装/解封装 libavcodec 编解码 libavutil 工具函数 libswscale 图像缩放/色彩转换 libswresample 音频重采样 libavfilter 滤镜/特效 说明 上层命令行工具调用核心库,核心库又依赖辅助库完成具体功能 libavutil 是所有库的基础依赖,提供内存、日志、数学等通用能力

除了这三个核心库,还有几个辅助库也很重要:

  • libswscale:图像缩放、色彩空间转换。我在做视频缩略图生成时经常用到。
  • libswresample:音频重采样、格式转换。比如把48kHz采样率转成44.1kHz。
  • libavfilter:滤镜库。裁剪、旋转、添加水印、调整亮度……都靠它。
  • libavdevice:设备输入输出。从摄像头采集、推流到设备,都归它管。

注意:libavutil虽然名字叫「工具库」,但它不是可有可无的。所有其他库都依赖它。如果你自己写代码调用FFmpeg的API,libavutil提供的日志、内存管理、数据结构会让你省很多事。

1.3 下载与安装:Windows / Mac / Linux

安装FFmpeg其实很简单。我这些年装过不下50次,踩过一些坑,下面把最稳的方法告诉你。

Windows

Windows下我推荐两种方式:

  1. 官方编译版(推荐):去FFmpeg官网下载Windows builds。选那个带full字样的,包含所有组件。下载后解压,把bin目录加到系统环境变量PATH里。
  2. 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格式输出视频的详细信息——编码格式、分辨率、码率、帧率、时长……嗯,这些数据在后面的课程里会反复用到。