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/stream1优化 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