ffmpeg 是一个媒体处理管线工具。它读取一个或多个输入,可选择性地对解码后的帧应用滤镜,并写入一个或多个输出。
管线模型 #
ffmpeg 根据以下组件构建管线:
- 解复用器读取容器数据并提供已编码的数据包;
- 解码器将数据包转换为原始帧;
- 滤镜图转换原始音频或视频帧;
- 编码器将经过滤镜处理的帧重新转换为数据包;
- 复用器将数据包交错写入输出容器。
该模型解释了命令行为何对选项顺序敏感,以及流选择为何十分重要。
命令行顺序 #
命令行具有位置含义:
sh
ffmpeg [global_options] [input_options] -i input ... [output_options] output ...实际使用中需要注意以下规则:
- 输入选项放在对应的
-i之前; - 输出选项放在对应的输出 URL 之前;
- 全局选项放在最前面;
- 文件之间会重置选项。
流选择 #
ffmpeg 可以自动选择流,但对于复杂任务,显式映射更加安全。
sh
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 -c copy output.mkv诸如 0:v:0 这样的流说明符会选择第一个输入中的第一个视频流。当容器包含多个音频轨道、字幕或附加图片时,应使用流说明符。
常见操作 #
流复制 #
在不解码或重新编码的情况下复制流:
sh
ffmpeg -i input.mkv -c copy output.mp4当目标容器接受现有编码格式时,这是速度最快的路径。
转码 #
当输出格式要求使用不同的编码器时,重新编码:
sh
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4裁剪 #
使用 -ss 和 -t 或 -to 裁剪片段:
sh
ffmpeg -ss 30 -i input.mp4 -t 60 -c copy clip.mp4当准确性更重要时,将 -ss 放在 -i 之后;当速度更重要时,将其放在 -i 之前。
提取音频 #
sh
ffmpeg -i input.mp4 -vn -c:a copy output.m4a-vn 会丢弃视频,而 -c:a copy 可避免重新编码音频流。
滤镜 #
简单滤镜附加到单个流:
sh
ffmpeg -i input.mp4 -vf "scale=-2:720,format=yuv420p" output.mp4复杂滤镜图可以组合多个输入:
sh
ffmpeg -i main.mp4 -i overlay.png -filter_complex "[0:v][1:v]overlay=10:10" output.mp4滤镜图语法属于 ffmpeg-filters(1)。逗号用于分隔链中的滤镜,分号用于分隔各条链。
探测 #
当输入布局不明确时,使用 ffprobe:
sh
ffprobe -hide_banner -show_streams -show_format input.mkv在编写 ffmpeg 命令之前,这是检查流索引、编码器名称、时长和元数据的最快方法。
实用标志 #
-shortest在最短的流结束时停止;-movflags +faststart将 MP4 元数据移动到文件开头;-y覆盖输出文件;-hide_banner缩短脚本输出;-loglevel error抑制信息噪声。
评论
在 GitHub 上阅读或评论(发表评论需要登录)