FFmpeg 安装与常用处理

从安装方式到裁剪、重采样、分片和批处理思路

Posted by Yvain Zhang on March 11, 2022 主题:技术

会写几条 FFmpeg 命令,和把 FFmpeg 真正用稳,是两回事。工程里更常见的难点其实就两个:

  1. 你装的 FFmpeg 到底支持哪些能力
  2. 面对不同任务,应该选拷贝、转码、裁剪、分片还是批处理

这篇就只谈一件事:FFmpeg 在项目里到底怎么落地。

1. 安装 FFmpeg 时先考虑什么

很多 Linux 发行版都能直接通过包管理器安装 FFmpeg,但实际工程里往往会遇到一个问题:仓库版本功能不完整。

原因通常包括:

  • 某些外部编码库没有启用
  • 许可证限制导致功能被裁剪
  • 版本偏旧

所以安装路径通常分两类:

  • 直接使用发行版仓库版本:快,适合快速验证
  • 源码编译:更可控,适合需要特定编码能力的场景

2. 为什么源码编译经常更实际

源码编译的价值不在于显得专业,而在于:

  • 可以启用指定编码器
  • 可以控制静态 / 动态库形式
  • 可以带上需要的过滤器和协议支持
  • 便于调试和复现构建环境

如果你的处理链路要依赖 libx264libx265libfdk_aac 或特定硬件能力,源码编译通常更稳。

3. 编译前常见依赖和思路

常见依赖通常包括:

  • yasm / nasm
  • libx264
  • libx265
  • libfdk-aac
  • SDL2

典型流程通常是:

  1. 安装依赖
  2. 下载 FFmpeg 源码
  3. ./configure
  4. make
  5. make install

这里最不能糊弄的其实是 configure 阶段,因为最后 FFmpeg 能干什么,基本就是这里定下来的。

4. 几类高频处理任务

裁剪一段视频

ffmpeg -ss 00:27:02 -t 00:32:06 -i input.mkv -c copy cut.mp4

如果只是快速裁剪并且允许关键帧边界,-c copy 是最划算的。

转 HLS

ffmpeg -i input.mp4 -c:v h264 -flags +cgop -g 30 -hls_time 20 -hls_list_size 0 -hls_segment_filename seg%03d.ts out.m3u8

这类命令适合把普通文件切成 HLS 片段,用于点播或轻量流媒体场景。

PCM 重采样

ffmpeg -f s16le -ar 48000 -ac 1 -i in.pcm -f s16le -ar 16000 -ac 1 out.pcm

这类处理在语音前处理、嵌入式音频链路里很常见。

从 WAV 提取裸 PCM

ffmpeg -i input.wav -ac 2 -ar 44100 -f s16le output.pcm

适合需要原始采样数据做算法处理或驱动联调的场景。

5. 批处理思路比单条命令更重要

在真实项目里,FFmpeg 经常不是“手敲一条命令完事”,而是被脚本、任务系统或服务批量调用。

比如你可能要把一份输入批量产出:

  • AAC-LC
  • HE-AAC
  • 不同采样率版本
  • 不同码率版本

这时候靠背命令没有意义,先把这几件事定义清楚更重要:

  • 输入格式
  • 目标格式
  • 目标参数模板
  • 失败重试与日志方式

6. 使用 FFmpeg 时最实用的经验

能不转码就别转码

如果只是换容器、抽流或粗裁剪,优先用 -c copy
重编码带来的代价包括:

  • 额外耗时
  • 质量损失
  • 更多参数和兼容性问题

先明确输出目标

你真正应该先问的是:

  • 目标平台要什么容器
  • 要什么编码
  • 是否关心实时性
  • 是否允许失真

善用自带帮助

FFmpeg 本身就有非常强的帮助系统:

ffmpeg -h muxer=flv
ffmpeg -h filter=atempo
ffmpeg -h encoder=libx264

很多时候查帮助比盲搜博客更稳,因为它直接对应你当前版本支持的能力。

7. 总结

如果非要把 FFmpeg 的工程使用压成一句话:

先明确目标,再决定是拷贝、转码、抽流、重采样还是分片。

安装只是第一步,后面真正拉开差距的,是你到底知不知道自己手里的 FFmpeg 能做什么、当前任务该选哪条路。