FFmpeg 视频处理和转码

FreeGuideOnline 24阅读 2026-07-11

bash brew install ffmpeg


安装完成后同样通过 `ffmpeg -version` 检查。

### 2.3 Linux 系统 (Debian/Ubuntu)

```bash
sudo apt update
sudo apt install ffmpeg

对于其他发行版,请使用对应的包管理器(如 dnfpacman)。

3. 基础概念速览

在深入命令之前,先了解几个核心概念:

  • 容器 (Container):文件的封装格式,如 MP4、MKV、AVI。它决定了音视频流如何组织存储。
  • 编码格式 (Codec):对视频或音频数据的压缩算法,如 H.264、H.265、AAC、MP3。
  • 码率 (Bitrate):每秒传输的比特数,直接影响文件体积和画质。
  • 帧率 (Frame Rate):每秒显示的帧数,常见 24、25、30、60 fps。
  • 分辨率 (Resolution):视频的宽度和高度,如 1920×1080。

一条典型的 FFmpeg 命令结构如下:

ffmpeg [全局选项] [输入选项] -i 输入文件 [输出选项] 输出文件

4. 获取文件信息

在处理文件之前,先用 ffprobeffmpeg 查看详细信息:

ffprobe video.mp4

或使用 ffmpeg 的无输出编码模式快速查看:

ffmpeg -i video.mp4 -hide_banner

信息中会显示流映射、编码格式、分辨率、时长、码率等重要参数。

5. 基本转码操作

5.1 更改容器格式(复制流)

如果编码格式无需改变,仅想更换容器,直接复制流(-c copy):

ffmpeg -i input.mkv -c copy output.mp4

这种操作速度极快,且不会损失质量。

5.2 视频转码

将视频转换为 H.264 编码并保留音频原样:

ffmpeg -i input.avi -c:v libx264 -c:a copy output.mp4
  • -c:v libx264:指定视频编码器为 x264(H.264 编码实现)。
  • -c:a copy:音频流直接复制。

转换为 H.265 (HEVC) 以获得更高压缩率:

ffmpeg -i input.mp4 -c:v libx265 -c:a aac output.mp4

5.3 音频提取与转换

从视频中仅提取音频并转为 MP3:

ffmpeg -i video.mp4 -vn -c:a libmp3lame output.mp3
  • -vn:禁用视频录制。

将音频转为 AAC 格式:

ffmpeg -i audio.wav -c:a aac -b:a 192k output.m4a
  • -b:a 设置音频码率。

6. 视频裁剪与画面处理

6.1 时间裁剪

截取从第 30 秒开始,持续 10 秒的片段:

ffmpeg -i input.mp4 -ss 00:00:30 -t 10 -c copy output.mp4
  • -ss:起始时间(可以放在 -i 之前实现快速定位)。
  • -t:持续时间。

若需精确裁剪并重新编码以保证关键帧,去掉 -c copy 即可。

6.2 画面裁剪(Crop)

将视频裁掉黑边,仅保留中央区域(例如宽度 1280,高度 720,从坐标 (10,20) 开始):

ffmpeg -i input.mp4 -vf "crop=1280:720:10:20" output.mp4

自动检测并裁去黑边:

ffmpeg -i input.mp4 -vf "cropdetect=24:16:0" -f null -

根据检测结果手动填入参数。

6.3 调整分辨率

缩放至 1280×720,并保持画面比例(使用 -1 自动计算高度):

ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4

强制拉伸可能导致变形,谨慎使用。

7. 合并与拼接视频

7.1 使用 concat 分离器(格式相同)

首先创建一个文本文件 list.txt,内容为:

file 'part1.mp4'
file 'part2.mp4'

然后执行:

ffmpeg -f concat -safe 0 -i list.txt -c copy merged.mp4

该方法要求所有文件的编码、分辨率等参数一致。

7.2 使用 concat 滤镜(格式不同)

对于格式不一致的文件,需要先编码成统一格式再拼接:

ffmpeg -i part1.mp4 -i part2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4

这会将视频流和音频流分别拼接。

8. 添加水印与字幕

8.1 图片水印

将 logo 放在视频右上角(例如距离右边 10 像素,距离上边 10 像素):

ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:10" output.mp4
  • overlay 滤镜的 x,y 坐标中 W 为主视频宽度,w 为水印图宽度。

8.2 硬编码字幕(烧录到画面)

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

也可以使用 ass 字幕获得更丰富的样式。

8.3 软字幕(内封字幕流)

将字幕流封装进容器,不烧录画面:

ffmpeg -i input.mp4 -i sub.srt -c copy -c:s mov_text output.mp4

对于 MKV 容器,使用 -c:s srtass

9. 控制码率与质量

9.1 固定码率(CBR)

设置视频码率为 2000 kbps:

ffmpeg -i input.mp4 -b:v 2000k -b:a 128k output.mp4

9.2 恒定质量模式(CRF)

使用 CRF 参数,值越小质量越高,18-28 为常用范围(x264 默认 23):

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

9.3 限制最大码率(VBV)

用于流媒体或特定设备兼容性:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 3000k -bufsize 6000k output.mp4

10. 调整帧率

将 30fps 视频转换为 24fps:

ffmpeg -i input.mp4 -r 24 output.mp4

或使用 fps 滤镜获得更平滑的帧率转换:

ffmpeg -i input.mp4 -vf "fps=24" output.mp4

11. 提取与切换音频轨道

列出所有音频流:

ffprobe -i input.mkv -show_streams -select_streams a

提取第二个音频流(索引从 0 开始):

ffmpeg -i input.mkv -map 0:a:1 -c copy audio2.aac

切换默认音频轨道或移除某条轨道,需结合 -map 重新封装:

ffmpeg -i input.mkv -map 0:v -map 0:a:0 -c copy output.mkv

12. 批量处理技巧

Windows 批处理示例:将文件夹内所有 .flac 转为 .mp3

for %i in (*.flac) do ffmpeg -i "%i" -c:a libmp3lame -q:a 2 "%~ni.mp3"

Linux/macOS Shell 示例:

for f in *.flac; do ffmpeg -i "$f" -c:a libmp3lame -q:a 2 "${f%.flac}.mp3"; done

13. 实用滤镜速查

13.1 视频加速/减速

2 倍速播放:

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -an output.mp4

半速播放:

ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -an output.mp4

同时处理音频速度需使用 atempo 滤镜。

13.2 垂直翻转/水平翻转

ffmpeg -i input.mp4 -vf "vflip" output.mp4   # 垂直
ffmpeg -i input.mp4 -vf "hflip" output.mp4   # 水平

13.3 旋转视频

顺时针旋转 90 度:

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