欢迎来到威聚,大家如果有需要哪个项目编译好的软件但无法自己下载可以进入项目推荐页面告诉我,我上传到网盘供大家下载使用!
威扬盘搜

FFmpeg

音视频处理 C LGPL-2.1 C 人工编写 推荐 ★5 易二开

更新于 2026-10-28 10:13:55

一句话定位

FFmpeg 是音视频领域的「瑞士军刀」:一套完整的解码 / 编码 / 转封装 / 滤镜 / 推流工具链,外加一组可以嵌进任何程序的库。你能想到的格式转换、压缩、剪切、抽帧、加字幕、切片推流,基本都是一行命令的事。

C 编写,GitHub 镜像 65.9k★(真实主仓在 git.ffmpeg.org),当前稳定版 9.0.2(官网下载页主推的源码包,GitHub 镜像 tag n9.0.2)。许可证以 LGPL-2.1+ 为主,部分可选组件是 GPL。

它是这个星球上被依赖最多的音视频基础设施:B 站、YouTube、OBS、VLC、Chrome、抖音的转码链路里都有它。

先认清三个工具

工具 干什么
ffmpeg 主力:转码、转封装、滤镜、推流、录屏
ffprobe 探针:查看容器/流/帧的元信息,输出 JSON/CSV/INI,脚本化必备
ffplay 极简播放器:验证一条命令的输出对不对,比开 GUI 快

还有几个小工具:qt-faststart(把 moov 提前,等价于 -movflags +faststart)、ismindex(平滑流索引)、aviocat(I/O 吞吐测试)。

底层库的分工也很清楚:

  • libavcodec —— 编解码器本体(最核心)
  • libavformat —— 容器格式与流协议(mp4/mkv/ts/hls/rtmp/rtsp…)
  • libavfilter —— 滤镜图(scale/crop/overlay/subtitles/loudnorm…)
  • libavutil —— 哈希、像素格式、数学、内存等基础设施
  • libswscale / libswresample —— 图像缩放与色彩转换 / 音频重采样与混音
  • libavdevice —— 采集与输出设备(v4l2、dshow、decklink…)

真正常用的命令(可直接抄)

1. 通用转码(最稳的一套参数)

ffmpeg -i in.mov -c:v libx264 -crf 20 -preset slow \
       -c:a aac -b:a 160k -movflags +faststart out.mp4

-crf 是质量优先的恒定质量模式(18 接近视觉无损,23 是默认心理档,28 开始明显掉细节),-preset 换编码速度,+faststart 把索引挪到文件头——网页播放必须加,否则要下完才能播。

2. 只缩分辨率,不重编码音频

ffmpeg -i in.mp4 -vf scale=-2:720 -c:v libx264 -crf 23 -c:a copy out.mp4

-2 让宽度按比例自动算成偶数(H.264 要求偶数尺寸)。

3. 剪切:两种精度,别用错

# 快:从关键帧开始切,不重编码,可能比指定时间早几秒
ffmpeg -ss 00:01:23 -i in.mp4 -t 10 -c copy clip.mp4

# 准:解码到精确帧,重新编码,慢但时间点准确
ffmpeg -i in.mp4 -ss 83 -t 10 -c:v libx264 -crf 20 -c:a aac clip.mp4

-ss 放在 -i 前是输入端 seek(快),放在后是输出端裁切(准)。要「又快又准」,可以两个都用:-ss 80 -i in.mp4 -ss 3 -t 10。

4. 合并多个片段(同编码同分辨率)

# list.txt 里每行 file 'part1.mp4'
ffmpeg -f concat -safe 0 -i list.txt -c copy out.mp4

参数不一致就会音画错乱,这种情况改用 concat 滤镜重编码。

5. 抽音轨 / 抽帧 / 抽缩略图

ffmpeg -i in.mp4 -vn -c:a copy out.m4a          # 无损抽音频
ffmpeg -i in.mp4 -an -c:v copy out.mp4          # 去音轨
ffmpeg -i in.mp4 -vf fps=1 frames/%05d.png      # 每秒一帧
ffmpeg -ss 5 -i in.mp4 -frames:v 1 cover.jpg    # 第 5 秒截图

6. 烧字幕 / 挂字幕

ffmpeg -i in.mp4 -vf "subtitles=sub.srt" -c:a copy out.mp4   # 烧进画面
ffmpeg -i in.mp4 -i sub.srt -c copy -c:s mov_text out.mp4    # 内挂软字幕

烧字幕需要编译时带 libass + libfreetype,发行版包一般都有。

7. HLS 切片(做点播/直播回放)

ffmpeg -i in.mp4 -c:v libx264 -crf 22 -c:a aac -b:a 128k \
       -f hls -hls_time 6 -hls_playlist_type vod out.m3u8

8. 硬件加速(有 N 卡就别忘了)

ffmpeg -hwaccel cuda -i in.mp4 -c:v h264_nvenc -preset p5 -cq 23 -c:a copy out.mp4

对应关系:NVIDIA *_nvenc / Intel *_qsv / macOS *_videotoolbox / Linux *_vaapi。同画质下硬件编码体积通常比 x264 大一点,换的是几倍到十几倍的速度。

9. 音量标准化(发布前必做)

ffmpeg -i in.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 -c:v copy out.mp4

平台推荐 -14 ~ -16 LUFS。要精确就做两遍:先跑一次拿 measured 参数,再带参数正式压。

10. 高质量 GIF

ffmpeg -i in.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif

不生成调色板直接转 GIF,画面会糊成一团噪点。

ffprobe:让脚本知道文件长什么样

ffprobe -v error -select_streams v:0 \
  -show_entries stream=codec_name,width,height,r_frame_rate,bit_rate \
  -of default=noprint_wrappers=1 in.mp4

输出就是干净的 key=value,直接进脚本判断「要不要转码」。要 JSON 就用 -of json —— 做批量转码流水线时,先 ffprobe 再决定 ffmpeg 参数,比拍脑袋定参数靠谱得多。

谁在用 / 适合谁

  • 视频站 / 自媒体:批量压缩、统一分辨率、加水印、切片上传;
  • 直播 / 会议系统:RTMP/SRT 推流、HLS 分发、录播落盘;
  • 监控 / 硬件:从 RTSP 拉流、抽帧送 CV 模型、录像转封装;
  • App 开发者:直接链 libavcodec 做解码、滤镜、重采样;
  • 任何需要「格式自由」的人:ffmpeg -i 任意文件 目标格式 就能救急。

版本在往哪走

近两个版本的官方亮点(值得知道,因为它能省掉很多外部工具):

  • 8.0「Huffman」(2025-08):原生 APV、ProRes RAW、RealVideo 6.0 解码;基于 Vulkan compute 的编解码(FFv1 编解、ProRes RAW 解);硬件编码补上 Vulkan AV1、VAAPI VVC;新增 Whisper 滤镜(直接调 whisper.cpp 出字幕);新增 colordetect、pad_cuda、scale_d3d11 等滤镜。
  • 8.1「Hoare」(2026-03):xHE-AAC / MPEG-H 解码(经 libmpeghdec,实验性);EXIF 元数据解析;LCEVC 元数据透传;Vulkan compute 扩到 ProRes 编解码与 DPX 解码;D3D12 的 H.264/AV1 编码与 scale_d3d12、deinterlace_d3d12;Rockchip 硬件编码;IAMF 的 Ambisonic 音频元素;新增 drawvg、vpp_amf 滤镜。

大方向很清楚:GPU 化(Vulkan/D3D12 compute 编解码)和把周边工具吃进来(字幕、色彩检测、矢量绘图)。

坑与注意(这一节比命令更重要)

  • GitHub 上的仓库是镜像,PR 会被无视。官方 README 写得很直白:补丁请提到 code.ffmpeg.org(Forgejo,8.0 起启用)或 ffmpeg-devel 邮件列表,用 git format-patch / git send-email。想贡献代码别在 GitHub 开 PR,白费力气。
  • 发行版自带的 ffmpeg 常常「缺胳膊少腿」:Debian/Ubuntu 官方包出于专利考虑,可能没有 libx264、没有 libfdk_aac、没有 H.264 编码器。要么用发行版的 ffmpeg 完整版/第三方源,要么用 BtbN、gyan.dev 的静态构建,要么自己编。
  • GPL 会传染:FFmpeg 本体是 LGPL,但 --enable-gpl(以及 libx264/libx265 这些 GPL 库)会让整个二进制变成 GPL。要把 ffmpeg 塞进闭源产品,就得用纯 LGPL 组件(比如 encoder 换成 openh264 / 硬编),或者干脆以独立进程调用。
  • -c copy 不是万能的:转封装很香,但源时长/时间基不一致、拼接片参数不同、流里带坏时间戳时,结果就是音画不同步或播放器卡住。症状诡异先怀疑 copy。
  • -ss 位置决定精度:如上,-i 前快但落在关键帧,-i 后准但慢。剪完发现「多了两秒片头」就是踩了这个。
  • 默认流选择会坑你:一个文件里有多个音轨/字幕轨时,ffmpeg 按内置规则挑一条,常常不是你要的。多轨场景一律显式 -map 0:v:0 -map 0:a:1 -map 0:s:0。
  • -vf 和 -filter_complex 不叠加:用了 -filter_complex 就得靠 -map "[label]" 把结果接出来,忘了 map 会报「Output file is empty」。
  • -vsync 已废弃:新版本用 -fps_mode(cfr/vfr/passthrough)。老教程里那套 -vsync 0 还在能跑,但日志会警告。
  • +faststart 需要二次写文件:它会在编码结束后重排 moov,输出到管道/流时用不了。
  • 别拿它当剪辑软件:精确到帧的多轨剪辑、调色、混音,用 Kdenlive / DaVinci。ffmpeg 是流水线里的批处理引擎。

二开建议

  • 只要自动化:别碰 API,写脚本调 CLI。参数用数组传(别拼字符串),版本升级时靠 ffmpeg -version 探测能力,别硬编码「一定有 libx265」。
  • 要编进程序:从 doc/examples/ 开始——transcode.c(解码→滤镜→编码全链路)、demuxing_decoding.c、filtering_video.c、resampling_audio.c,比官方文档好懂。
  • 用新 API:avcodec_send_packet() / avcodec_receive_frame() 这套(3.1 起)是唯一正确的用法,老教程里的 avcodec_decode_video2() 已经废弃,照抄会编译告警甚至行为异常。
  • 硬件帧要过 hwcontext:硬解出来的是 GPU 表面,直接喂 CPU 滤镜会失败;要 av_hwframe_transfer_data() 下载,或者用 scale_cuda/scale_vaapi 这类 GPU 滤镜整条链留在显存里。
  • 自己编一次:./configure --prefix=/opt/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libopus --enable-libass --enable-libfreetype --enable-libmp3lame,装好 nasm/yasm 和对应 -dev 包。想同时提供「GPL 版」和「LGPL 版」,就编两次、放两个目录,别混。
  • 看源码结构:libavcodec/ 里每个编解码器一个目录,libavfilter/vf_*.c 一个滤镜一个文件,改起来比想象中直观。

一句话总结

FFmpeg 不是「一个转码软件」,而是音视频世界的标准层:格式、协议、编解码、滤镜全都在这。日常 90% 的需求是十行命令的事(转码、压缩、剪切、抽帧、切片、标准化响度),剩下 10% 才需要碰 API。真正要记住的不是参数表,而是三个判断:要不要重编码(-c copy 还是编码)、精度要不要到帧(-ss 放哪)、许可证会不会传染(GPL 还是 LGPL)。版本正在快速 GPU 化,值得每隔半年回来看一眼。

按更新时间依次阅读