FFmpeg 视频处理和转码
bash brew install ffmpeg
安装完成后同样通过 `ffmpeg -version` 检查。
### 2.3 Linux 系统 (Debian/Ubuntu)
```bash
sudo apt update
sudo apt install ffmpeg
对于其他发行版,请使用对应的包管理器(如 dnf、pacman)。
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. 获取文件信息
在处理文件之前,先用 ffprobe 或 ffmpeg 查看详细信息:
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 srt 或 ass。
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