ffmpeg参数篇
# ffmpeg 参数篇
下面介绍 FFmpeg 参数相关的知识以及命令格式,从基本语法到参数分类,再到一些常见用法,帮助你更深入地理解 FFmpeg 命令行工具的工作原理。
# FFmpeg 命令格式概述
FFmpeg 命令行工具的基本语法大致如下:
ffmpeg [全局参数] {[输入选项] -i 输入文件}... {[输出选项] 输出文件}...
1
- 全局参数:对整个命令有效,如
-y
(覆盖输出文件)、-loglevel
(设置日志级别)等。 - 输入选项:放在
-i
前面的参数,只对紧跟其后的输入文件生效,例如-ss
用于设置起始时间(快速定位输入流)。 - 输出选项:出现在输入文件之后,专门控制输出文件的编码、格式等,如
-c:v
(指定视频编码器)、-b:a
(音频比特率)等。
这类结构让 FFmpeg 的命令既灵活又具有明确的定位意义,输入选项和输出选项分别对应数据的不同处理阶段。
# 示例解析
ffmpeg -y -ss 00:01:00 -t 10 -i input.mp4 -c:v libx264 output.mp4
1
-y
:全局参数,强制覆盖输出文件。-ss 00:01:00
:输入选项,从输入文件的 1 分钟处开始读取。-t 10
:输出选项,输出视频时长为 10 秒。-i input.mp4
:输入文件。-c:v libx264
:输出选项,指定视频编码器为 H.264。output.mp4
:输出文件路径。
# 参数分类
# 全局参数(Global Options)
- 作用范围:对整个命令生效(包括所有输入和输出),通常在命令开头设置。
- 控制命令的整体行为(如日志、线程、文件覆盖)。
- 常见参数:
-y
:覆盖已存在的输出文件(无需确认)。-n
:禁止覆盖输出文件。-loglevel <level>
:设置日志输出级别(如error
,warning
,info
,debug
)。-threads <num>
:指定处理线程数。-hide_banner
:隐藏 FFmpeg 版本和编译信息,使命令输出更简洁。
示例
ffmpeg -hide_banner -y -i input.mp4 output.avi
1
# 输入参数(Input Options)
- 作用范围:仅对紧随其后的
-i
输入文件或流生效。- 针对每个输入文件设置读取规则(如时间定位、解码方式)。
- 常见参数:
-ss <time>
:快速定位到输入文件的某个时间点(基于关键帧跳跃,速度快但精度低)。-to <time>
:设置输入文件的结束时间。-t <duration>
: 指定持续时间(如-t 10
表示处理 10 秒)。-f <format>
:强制指定输入文件的格式(如-f rawvideo
处理原始视频流)。-hwaccel <type>
:指定硬件加速解码方式(如cuda
,qsv
)。-re
:以真实速率读取输入流,通常用于实时流媒体传输。
示例
# 从输入文件的 30 秒处开始读取,持续 5 秒
# 由于未指定编码参数,FFmpeg 将根据输入文件的编解码器和输出文件的容器格式,自动选择适当的编解码器进行转码
ffmpeg -ss 00:00:30 -t 5 -i input.mp4 output.mp4
1
2
3
2
3
# 输出参数(Output Options)
- 作用范围:仅控制输出文件的编码、格式和内容质量。
- 定义输出文件的编码、格式和内容(如码率、分辨率、滤镜)。
- 核心参数:
- 编码器选择:
-c:v <codec>
:视频编码器(如libx264
(H.264 编码器)、libx265
(H.265 编码器),copy
表示不转码)。-c:a <codec>
:音频编码器(如aac
,mp3
)。-c:s <codec>
:字幕编码器(如srt
,mov_text
)。
- 码率与质量:
-b:v 2M
:设置视频码率(2Mbps)。-b:a
:设置音频比特率。-crf 23
:常用在 H.264/AVC 编码中,用于控制视频质量(数值越低,视频质量越高,文件越大)。-vn
:禁用视频流。-q:a 2
:MP3 音频质量(0-9,值越小质量越高)。
- 帧率和分辨率:
-r
:设置帧率,如-r 30
表示输出视频为 30 帧每秒。-s
:设置分辨率,如-s 1280x720
。
- 格式与容器:
-f
:指定输出文件格式,例如-f mp4
、-f flv
等,有时可以省略,由输出文件扩展名自动识别。
- 滤镜处理:
-vf "scale=1280:720"
:缩放视频分辨率。-vf
可用于执行缩放、裁剪、叠加文字等操作-af "volume=0.5"
:降低音频音量。
- 时间控制:
-ss <time>
:输出文件的起始时间(需与输入选项的-ss
区分)。-t <duration>
:输出文件的持续时间。
- 编码器选择:
示例
# 将输入视频缩放为 720p,转码为 H.265,并降低音频码率
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx265 -crf 25 -c:a aac -b:a 128k output.mp4
# 快速剪切视频(不转码)
ffmpeg -ss 00:00:30 -to 00:02:00 -i input.mp4 -c copy output.mp4
# 硬件加速转码(NVIDIA GPU)
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4
# 提取音频并转换格式
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
# 应用了两个滤镜:缩放和添加文本
# 将视频缩放至宽度 640 像素,高度 360 像素。scale 滤镜常用于调整视频尺寸。
# 添加文本“Hello”。文本颜色为白色(fontcolor=white),字体大小为 24(fontsize=24)。drawtext 滤镜用于在视频帧上渲染文本。
ffmpeg -y -i input.mp4 -vf "scale=640:360,drawtext=text='Hello':fontcolor=white:fontsize=24" output.mp4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
需要注意的是,使用
-c copy
时,
- FFmpeg 只能在关键帧(I 帧)上进行剪辑。
- 如果指定的开始时间
00:00:30
不是关键帧,FFmpeg 将自动调整到最近的关键帧,这可能导致剪辑的起始时间与预期不完全一致。- 因此,如果您需要精确地从特定时间点开始剪辑,建议不使用
-c copy
,让 FFmpeg 重新编码视频,以确保准确性。
# 参数顺序与位置的重要性
在 FFmpeg 命令行中,参数的位置非常重要。常见注意事项包括:
- 输入选项与输出选项:
例如,
-ss
如果放在-i
之前会影响读取速度(跳转到指定位置),而放在输出参数中则会影响剪辑精度。 - 多个输入或输出:
当存在多个
-i
时,每个输入可以单独设置相应的选项,输出选项也会分别对应前面的输入。正确设置顺序有助于确保每个文件按照预期处理。
# 高级参数与调优技巧
# 编码优化
- CRF 与预设:
对于 H.264 编码,常使用
-crf
控制质量,同时使用-preset
调整编码速度和压缩效率。数值较低表示更高质量但文件更大;预设从ultrafast
到veryslow
不等。 - GOP 结构调整:
通过
-g
参数设置关键帧间隔(GOP size),合理的 GOP 结构可以提高视频的播放流畅度和压缩率。
# 多路复用与流媒体
容器格式:
使用
-f
参数可以指定输出格式,如实时流媒体传输时常用flv
格式:ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://server/app/stream
1优化 MP4 文件:
使用
-movflags +faststart
参数可以使 MP4 文件在网络环境下更快开始播放,因为它将关键元数据移至文件开头。
# 复杂滤镜链
使用 -filter_complex
参数可以实现多路输入和多路输出的高级处理,比如视频拼接、画中画(PIP)等。
例如,将两个视频并排拼接:
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2" output.mp4
1
# 注意事项
- 输入/输出选项的
-ss
区别:- 输入选项
-ss
:快速定位,但精度低。 - 输出选项
-ss
:逐帧处理,精度高但速度慢。
- 输入选项
- 流选择冲突:
- 默认情况下,FFmpeg 会为每个输出文件自动选择一个视频流、一个音频流和一个字幕流。使用
-map
手动指定流可避免意外结果。
- 默认情况下,FFmpeg 会为每个输出文件自动选择一个视频流、一个音频流和一个字幕流。使用
- 格式兼容性:
- 输出文件的封装格式(如 MP4、MKV)需支持所选编码器(如 H.265 需 MP4 支持)。
上次更新: 2025/2/8 18:02:22