Loading...

文章背景图

FFmpeg:音视频处理领域的开源瑞士军刀|部署与使用全指南

2026-10-28
0
- 字
- 分钟
|

官方信息表

项目 说明
项目名称 FFmpeg
一句话定位 处理音视频内容的开源库与命令行工具集合
所属组织 FFmpeg 开源社区
代码仓库 FFmpeg/FFmpeg
实现语言 C
官方网站 ffmpeg.org
开源协议 LGPLv2.1+(部分组件 GPL)
Star 数 66k+
主要工具 ffmpeg / ffplay / ffprobe

官方配图

FFmpeg 项目官方图

项目背景

FFmpeg 是一套用来处理音视频内容的开源库和工具集合,README 开篇就说:"FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata." 也就是说,音频、视频、字幕、元数据,凡是和多媒体相关的,FFmpeg 都能处理。

你可能没直接用过 FFmpeg,但你几乎每天都在间接使用它。网页里的 HTML5 视频播放器、B 站的视频转码、抖音的视频处理、Zoom 的视频会议、OBS 的推流后端、VLC 播放器,背后都调用了 FFmpeg 的库。它是整个多媒体领域最基础的基础设施之一,被称为"音视频领域的瑞士军刀"。

FFmpeg 最早由 Fabrice Bellard(FFmpeg 这个名字里的 F 就来自 Fabrice)在 2000 年发起,后来由 Baptiste Coudurier 和其他社区开发者维护。项目采用 LGPL 协议(可选 GPL),任何人都可以免费使用、修改、重新分发。FFmpeg 不只是一个命令行工具,它更是一套开发库,开发者可以把 libavcodec、libavformat 等库链接到自己的程序里,做出各种音视频处理应用。

经过二十多年的发展,FFmpeg 已经支持了上千种音视频编解码格式和几百种封装格式,几乎所有你能想到的多媒体格式它都能处理。这种"大而全"的特性让它成为多媒体领域的事实标准,新出的编解码器或容器格式通常会先在 FFmpeg 里实现,再被其他软件集成。

FFmpeg 的命令行工具虽然看起来参数很多,但实际用起来就像乐高积木:输入文件、指定输出、加几个滤镜,就能完成复杂的转码任务。学会基本的命令后,你会发现它比任何图形界面工具都高效,特别是在批量处理场景下。

和商业转码软件相比,FFmpeg 的优势在于:跨平台、支持格式最全、完全免费、可以脚本化批量处理、社区活跃。很多商业公司的转码集群底层都是跑 FFmpeg,因为它的性能和格式支持比任何商业编码器都更全面。

FFmpeg 的开发模式和其他开源项目不太一样,README 明确说明:补丁应该提交到 Forgejo 代码托管 或者 ffmpeg-devel 邮件列表,用 git format-patch 或 git send-email 发送;GitHub 上的 Pull Request 不会被处理,会被直接忽略。这是因为 FFmpeg 团队坚持使用邮件列表做代码评审,而不是 GitHub 界面。

核心特性逐条翻译

README 列出了 FFmpeg 的七大库和三大工具,逐条翻译如下:

libavcodec(编解码库)。 提供几乎所有音视频编解码器的实现,包括 H.264、H.265、AV1、VP9、AAC、MP3、Opus 等。是整个多媒体领域支持格式最全的编解码库。

libavformat(封装格式库)。 实现各种流媒体协议和容器格式,包括 MP4、MKV、AVI、FLV、HLS、DASH、RTMP、RTSP 等。它负责把编码后的音视频数据封装成文件或流。

libavutil(工具库)。 包含哈希、解压缩、数学运算、像素格式转换等杂项工具函数。

libavfilter(滤镜库)。 用有向图的方式组合各种滤镜,对解码后的音视频做处理。比如缩放、裁剪、加水印、调色、变速、音频重采样、混音。

libavdevice(设备库)。 提供采集和播放设备的抽象层,可以从摄像头、麦克风、桌面采集画面,也可以把画面输出到设备。

libswresample(音频重采样库)。 实现音频混音和重采样,把不同采样率、声道数、样本格式的音频统一转换。

libswscale(视频缩放库)。 实现颜色空间转换和图像缩放,把 YUV 转 RGB、缩放分辨率、裁剪。所有视频播放器在显示画面时都要经过这个库做像素格式转换。

附加小工具。 还有 aviocat(AVI 流拼接)、ismindex(生成 HLS/DASH 索引)、qt-faststart(把 MP4 的 moov 原子移到文件头部,让视频可以边下边播)等辅助工具。

这些库是解耦的:你可以只用 libavcodec 做解码,不用 libavformat;也可以只用 libavfilter 做后处理。开发者根据需要链接其中几个库,不需要把整个 FFmpeg 都拉进来。

这种模块化设计让 FFmpeg 可以被裁剪到很小,比如嵌入式设备上只需要解码 H.264 播放视频,就可以只编译 libavcodec 和 libavformat,其他库全部关掉,整个二进制可以控制在几 MB 以内。

ffmpeg 命令行工具。 最核心的命令行工具箱,用来转码、转换格式、剪辑、推流、处理多媒体内容。

ffplay 播放器。 一个极简的多媒体播放器,基于 FFmpeg 和 SDL 开发,适合调试和快速预览。

ffprobe 分析工具。 用来检查多媒体文件的元信息,比如分辨率、码率、时长、编码格式、流信息。做批量处理脚本时,经常先用 ffprobe 读出视频参数,再决定用什么参数转码。

附加小工具。 还有 aviocat(AVI 流拼接)、ismindex(生成 HLS/DASH 索引)、qt-faststart(把 MP4 的 moov 原子移到文件头部,让视频可以边下边播)等辅助工具。

环境要求

FFmpeg 可以在几乎所有平台上编译运行:

  • 操作系统:Linux、Windows、macOS、BSD;
  • 编译器:GCC、Clang、MSVC 均可;
  • 可选依赖:libx264、libx265、libvpx、fdk-aac、LAME、opus 等第三方编解码器,用来支持更多格式;
  • 硬件:纯 CPU 即可运行,编译时可以开启 NVENC、QSV、VideoToolbox 等硬件加速支持。

对于日常转码需求,一台普通办公电脑就够了。如果要做批量转码(比如一次转几百个视频),建议用多核 CPU 和大容量内存,因为 FFmpeg 会把整个视频帧加载到内存里处理。

如果你有 NVIDIA 显卡,强烈建议编译时启用 NVENC,这样转码速度会比纯 CPU 快 5-10 倍,而且不占用 CPU 资源。Intel 核显也有 QSV 硬件加速,AMD 显卡有 AMF。

部署步骤

方式一:用包管理器安装(推荐新手)

大多数 Linux 发行版的官方源里都有 FFmpeg:

# Debian/Ubuntu
sudo apt install ffmpeg

# Fedora
sudo dnf install ffmpeg

# Arch
sudo pacman -S ffmpeg

macOS 用户用 Homebrew:

brew install ffmpeg

Windows 用户可以从 ffmpeg.org 下载预编译的 Windows 构建版本,解压后把 bin 目录加到 PATH 即可。

包管理器安装的版本通常是稳定版,适合日常使用。如果你需要最新特性(比如新的 AV1 编码优化),可以从源码编译。

方式二:从源码编译

从源码编译可以获得最新特性和更多编解码支持。README 指向了官方文档,编译流程大致如下:

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libmp3lame
make -j$(nproc)
sudo make install

./configure 时可以通过 --enable-libxxx 参数启用第三方编解码器,通过 --enable-nvenc 启用 NVIDIA 硬件编码。具体参数列表运行 ./configure --help 查看。

编译 FFmpeg 是一个比较耗时的过程,完整编译可能需要 30 分钟到几小时,取决于你启用的库数量和机器性能。建议在编译前先用 ./configure --help 了解所有可选参数,根据自己的需求裁剪,不要盲目启用所有选项。

编译完成后,ffmpeg、ffplay、ffprobe 三个工具会安装到 /usr/local/bin,库文件安装到 /usr/local/lib。你可以用 ffmpeg -version 验证安装是否成功,它会列出当前编译的配置和启用的库。

方式三:Docker 运行

不想装本地环境,可以直接用官方 Docker 镜像:

docker run --rm -v /data:/data jrottenberg/ffmpeg -i /data/input.mp4 /data/output.mp4

Docker 方式适合在服务器上做批量转码,不污染宿主机环境。你可以把转码脚本写进容器,定时跑批处理。

方式四:在线体验

如果你只是想快速试一下 FFmpeg 能做什么,可以用 Web 版 FFmpeg 界面,比如 FFmpeg.wasm,它把 FFmpeg 编译成 WebAssembly 在浏览器里运行,不需要安装任何东西。

这种在线方式适合临时处理小文件,大文件还是建议本地安装,因为浏览器处理能力有限。

对于开发者来说,FFmpeg 也是学习多媒体技术最好的教材。它的源码质量很高,注释详细,覆盖了编解码、容器、滤镜、协议等所有多媒体领域的核心知识。很多多媒体工程师都是从读 FFmpeg 源码开始入门的。

如果你是做音视频开发的,FFmpeg 是必学项目。它的文档和示例在 doc/examples 目录里有完整的 C 代码示例,覆盖了解码、编码、过滤、转码等常见场景。

使用方法

FFmpeg 最常用的命令是格式转换:

# 把 input.avi 转成 input.mp4
ffmpeg -i input.avi output.mp4

查看视频信息:

ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

裁剪视频片段:

# 从第 30 秒开始,剪 10 秒
ffmpeg -ss 30 -i input.mp4 -t 10 -c copy output.mp4

压缩视频:

ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a aac output.mp4

提取音频:

ffmpeg -i input.mp4 -vn -acodec libmp3lame output.mp3

拼接视频:

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

录屏(Linux):

ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4

推流到 RTMP 服务器:

ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream_key

批量处理一个文件夹里的视频,统一转成 H.264 MP4:

for f in *.avi; do ffmpeg -i "$f" -c:v libx264 -crf 23 -c:a aac "${f%.avi}.mp4"; done

从视频里提取一帧缩略图:

ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 thumbnail.jpg

把图片序列合成视频:

ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4

给视频加字幕:

ffmpeg -i input.mp4 -vf subtitles=sub.srt output.mp4

旋转视频 90 度:

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

降低音量:

ffmpeg -i input.mp4 -af "volume=0.5" output.mp4

把两个视频左右拼接:

ffmpeg -i left.mp4 -i right.mp4 -filter_complex hstack output.mp4

把图片做成动态视频(Ken Burns 效果):

ffmpeg -loop 1 -i photo.jpg -t 5 -r 30 -c:v libx264 -pix_fmt yuv420p output.mp4

提取视频中的字幕流:

ffmpeg -i input.mp4 -map 0:s:0 sub.srt

这些只是冰山一角。FFmpeg 的滤镜系统非常强大,你可以把多个滤镜用逗号串联成一条处理链,实现任何你能想到的音视频后处理。

如果你是开发者,还可以把 FFmpeg 的库链接到自己的 C/C++ 程序里,开发自定义的音视频处理应用。README 提到 doc/examples 目录里有编码、解码、过滤、转码等示例代码,是学习 FFmpeg 编程的最好起点。

常见问题(FAQ)

问:FFmpeg 和格式工厂、魔影工厂有什么区别? 那些是图形界面的封装工具,底层很多就是调用 FFmpeg。FFmpeg 是命令行工具,灵活度更高,适合脚本化和批量处理。

问:FFmpeg 支持哪些视频格式? README 说明 libavcodec 提供了极广范围的编解码器实现,常见的 H.264、H.265、AV1、VP9、MPEG4 都支持。具体格式列表看官方格式文档。

问:CRF 参数是什么意思? CRF(Constant Rate Factor)是 x264 等编码器的质量参数,范围 0-51,数值越小画质越好文件越大,常用值 18-28。

问:FFmpeg 可以商用吗? 可以。FFmpeg 主要是 LGPL 协议,商用时动态链接即可;如果用了 GPL 组件或者静态链接,需要开源你的修改。具体看 LICENSE 文件。

问:为什么我编译出来的 FFmpeg 不支持某个格式? 因为 ./configure 时没有启用对应的第三方库。运行 ffmpeg -configure 可以看当前编译的配置,缺什么加 --enable-libxxx 重新编译。

问:FFmpeg 支持硬件加速吗? 支持。编译时加上 --enable-nvenc(NVIDIA)、--enable-libmfx(Intel QSV)等参数,运行时用 -c:v h264_nvenc 指定硬件编码器。

问:FFmpeg 命令行参数太多记不住怎么办? 官方文档在 ffmpeg.org 有完整的参数列表。实际使用中最常用的也就 -i(输入)、-c:v(视频编码器)、-c:a(音频编码器)、-ss(起始时间)、-t(时长)、-vf(视频滤镜)、-crf(质量参数)这几个。

问:FFmpeg 可以批量处理吗? 可以。把命令写成 shell 脚本循环就行,比如 for f in *.mov; do ffmpeg -i "$f" "${f%.mov}.mp4"; done。

问:FFmpeg 和 VLC 是什么关系? VLC 用的是自己的编解码库,不是 FFmpeg。但很多播放器(比如 mpv、StellarPlayer)都是直接基于 FFmpeg 开发的。

问:FFmpeg 可以加水印吗? 可以,用 -vf "movie=logo.png,scale=100:100[wm];[in][wm]overlay=10:10[out]" 命令就能在视频角落加 logo。

问:FFmpeg 能处理流媒体吗? 可以。FFmpeg 支持 RTMP、RTSP、HLS、DASH、SRT 等协议,可以从网络拉流处理,也可以把处理后的流推到服务器。做直播转码时最常用的就是 FFmpeg。

问:FFmpeg 命令行参数太多,有没有图形界面? 有。第三方基于 FFmpeg 的图形界面工具很多,比如 Shutter Encoder(Windows)、MPEG Streamclip(macOS)、HandBrake(跨平台)。这些工具底层都是调用 FFmpeg,但提供了可视化操作。

问:FFmpeg 可以批量压缩视频吗? 可以,写个 shell 脚本循环处理就行。建议先写命令处理一个文件,确认效果满意后再批量跑,避免一次跑几百个文件结果参数不对。

问:FFmpeg 处理 4K 视频会卡吗? 取决于 CPU 性能。4K 转码比 1080p 慢 4 倍以上,建议用硬件加速(NVENC/QSV)或者降低分辨率。

问:FFmpeg 可以提取音频吗? 可以,用 ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3 就能把视频里的音轨抽出来转成 MP3。

问:FFmpeg 可以拼接多个视频吗? 可以,用 concat 协议:先把视频文件路径写进一个列表文件,再用 -f concat -safe 0 -i list.txt -c copy output.mp4 合并。

跳转链接

评论交流

文章目录