FFmpeg 用户指南

最后更新: 2021-05-09 05:38:32 +0800 +0800
tags: Ffmpeg | Media | Video
原文以英文撰写。您正在阅读AI翻译版本。

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 上阅读或评论(发表评论需要登录)