160 lines
5.2 KiB
Markdown
160 lines
5.2 KiB
Markdown
|
|
# ffmpeg 视频处理速查(学习用)
|
|||
|
|
|
|||
|
|
> ffmpeg 是命令行音视频处理神器,一个命令搞定转码、剪辑、拼接、加水印、加字幕等。
|
|||
|
|
> 安装:`sudo apt install ffmpeg`(Ubuntu/Debian)
|
|||
|
|
> 查看帮助:`ffmpeg -h`、`ffmpeg -filters`(所有可用滤镜)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 0. 先记住几个核心参数
|
|||
|
|
|
|||
|
|
| 参数 | 含义 | 示例 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `-i 文件` | 输入文件(可有多个) | `-i a.mp4` |
|
|||
|
|
| `-ss 秒` | 从第几秒开始(跳转) | `-ss 00:01:30` |
|
|||
|
|
| `-t 秒` | 持续时长 | `-t 10` 取10秒 |
|
|||
|
|
| `-to 时间` | 到某个时间点结束 | `-to 00:02:00` |
|
|||
|
|
| `-c:v 编码` | 视频编码(`copy`=不重编码,`libx264`=H.264) | `-c:v copy` |
|
|||
|
|
| `-c:a 编码` | 音频编码(`aac`、`libmp3lame`、`copy`) | `-c:a aac` |
|
|||
|
|
| `-crf 数值` | H.264 质量(0-51,越小越清晰文件越大,常用 18-23) | `-crf 20` |
|
|||
|
|
| `-preset` | 编码速度/压缩率权衡 | `medium`、`fast`、`slow` |
|
|||
|
|
| `-vf` | 视频滤镜(filter)链 | `-vf scale=1280:720` |
|
|||
|
|
|
|||
|
|
**黄金法则**:只是剪切/换封装/抽流,用 `-c copy`(秒完成、不损失画质);要改分辨率/画质/滤镜,才重编码。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 格式转换 / 换封装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 视频转成 MP4(H.264 + AAC,兼容性最好)
|
|||
|
|
ffmpeg -i input.mkv -c:v libx264 -crf 20 -preset medium -c:a aac output.mp4
|
|||
|
|
|
|||
|
|
# 只看视频不看编码:秒换容器(.mkv -> .mp4)
|
|||
|
|
ffmpeg -i input.mkv -c copy output.mp4
|
|||
|
|
|
|||
|
|
# 只提取音频(视频不要,转成 mp3)
|
|||
|
|
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 2. 截取片段(剪辑)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 取 00:01:30 到 00:03:00 的 90 秒,重编码
|
|||
|
|
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:03:00 -c:v libx264 -crf 20 -c:a aac clip.mp4
|
|||
|
|
|
|||
|
|
# 取前 10 秒,用 copy 秒完成(不重编码,速度极快)
|
|||
|
|
ffmpeg -i input.mp4 -ss 0 -t 10 -c copy clip.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
> 注意:用 `copy` 时 `-ss` 放在 `-i` 前(快进式)比放在 `-i` 后(逐帧解码)快得多,但可能不够精确到帧。精确剪辑用 `-ss` 放 `-i` 后 + 重编码。
|
|||
|
|
|
|||
|
|
## 3. 拼接多个视频
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 方法一:先写一个文本清单 files.txt
|
|||
|
|
# file '1.mp4'
|
|||
|
|
# file '2.mp4'
|
|||
|
|
ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mp4
|
|||
|
|
|
|||
|
|
# 方法二:同一编码/规格直接用 concat 滤镜(需重编码,格式不一时用)
|
|||
|
|
ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1" -c:v libx264 -c:a aac merged.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 4. 缩放 / 改分辨率
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 缩放成 1280x720,保持画质
|
|||
|
|
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 20 -c:a aac output.mp4
|
|||
|
|
|
|||
|
|
# 等比缩放(宽为 1280,高度自动按比例)
|
|||
|
|
ffmpeg -i input.mp4 -vf scale=1280:-2 -c:v libx264 -crf 20 -c:a aac output.mp4
|
|||
|
|
# -2 表示保持比例并让高度为偶数(H.264 要求偶数分辨率)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 5. 抽帧(视频转图片,用于预览/做封面)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 每秒抽 1 帧
|
|||
|
|
ffmpeg -i input.mp4 -vf fps=1 frame_%03d.png
|
|||
|
|
|
|||
|
|
# 抽指定时刻的一帧(第 5 秒)
|
|||
|
|
ffmpeg -ss 5 -i input.mp4 -frames:v 1 cover.png
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 6. 加水印
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 图片水印(logo.png,放在右上角)
|
|||
|
|
ffmpeg -i input.mp4 -i logo.png -filter_complex \
|
|||
|
|
"[1:v]scale=150:150[logo];[0:v][logo]overlay=W-w-10:10" \
|
|||
|
|
-c:v libx264 -c:a aac output.mp4
|
|||
|
|
|
|||
|
|
# 文字水印(drawtext 滤镜,注意文字里的冒号要转义)
|
|||
|
|
ffmpeg -i input.mp4 -vf "drawtext=text='Doubao':fontsize=48:fontcolor=white:x=10:y=10" \
|
|||
|
|
-c:v libx264 -c:a aac output.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 7. 加字幕(烧录进画面)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# subtitles 滤镜把 .srt 字幕"烧"进视频(变成画面的一部分)
|
|||
|
|
ffmpeg -i input.mp4 -vf "subtitles=sub.srt" -c:v libx264 -c:a aac output.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 8. 合并音视频 / 更换配音
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 把 video.mp4 的画面 + audio.mp3 的声音合到一起
|
|||
|
|
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest output.mp4
|
|||
|
|
|
|||
|
|
# 去掉原视频声音,换成新的音轨
|
|||
|
|
ffmpeg -i video.mp4 -i new_audio.mp3 -map 0:v -map 1:a -c:v copy -c:a aac output.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 9. 变速(快放 / 慢放)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1.5 倍速(setpts 调视频时间,atempo 调音频音调不失真)
|
|||
|
|
ffmpeg -i input.mp4 -vf "setpts=0.667*PTS" -af "atempo=1.5" -c:v libx264 -c:a aac fast.mp4
|
|||
|
|
|
|||
|
|
# 0.5 倍慢放
|
|||
|
|
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" -c:v libx264 -c:a aac slow.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 10. 转 GIF
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 截前 5 秒转 GIF,128 宽、10 帧/秒
|
|||
|
|
ffmpeg -i input.mp4 -t 5 -vf "fps=10,scale=128:-1" -loop 0 out.gif
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 11. 图片合成视频(幻灯片)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 每张图显示 2 秒,串成 720p 视频
|
|||
|
|
ffmpeg -framerate 1 -pattern_type glob -i 'img_*.jpg' \
|
|||
|
|
-vf "scale=1280:720,fps=2" -c:v libx264 -c:a aac slideshow.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 12. 视频静音 / 音量调整
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 去掉所有声音
|
|||
|
|
ffmpeg -i input.mp4 -an output.mp4
|
|||
|
|
|
|||
|
|
# 音量调到 50%
|
|||
|
|
ffmpeg -i input.mp4 -af "volume=0.5" -c:v copy output.mp4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 实战小练习建议
|
|||
|
|
|
|||
|
|
1. 找一个视频,练习**截取前 10 秒 + 转 mp3**(练 `-ss/-t/-c copy`);
|
|||
|
|
2. 试着**抽 1 帧做成封面图**(练 `fps`/`-frames:v`);
|
|||
|
|
3. 给视频**加一行中文文字水印**(练 `drawtext`);
|
|||
|
|
4. 把 2 段视频**拼接**起来(练 `concat`)。
|
|||
|
|
|
|||
|
|
踩到报错别怕,把最后的报错行发我,我帮你解析。更多高阶玩法(绿幕抠像、去抖、色彩调整)也可以随时问我。
|