打开终端后,先确认程序能运行,再用一段短视频完成探测、转封装和转码。命令按 Windows PowerShell 编写。

查看、处理和播放

工具职责最常见的动作
ffprobe读取媒体信息查看流、编码、分辨率、时长
ffmpeg处理媒体并输出换容器、转码、剪切、推流
ffplay播放媒体观察画面、试听声音

它们是三个可独立运行的程序,不是同一个命令的三个参数。先记成:ffprobe 看,ffmpeg 做,ffplay 播。

flowchart LR
I[输入媒体] --> P[ffprobe<br/>看结构]
I --> F[ffmpeg<br/>处理并输出]
F --> O[输出媒体]
O --> V[ffplay<br/>播放验收]
P -. 提供编码和流的事实 .-> F

ffprobe 用来核对结构,ffplay 用来观察播放效果;两种检查回答的问题不同。

检查安装和能力

Terminal window
ffmpeg -version
ffprobe -version
ffplay -version

三条都能返回版本,说明程序在 PATH 里。版本信息里的构建配置决定了有哪些编码器、Filter 和协议。要用某个编码器前,先问当前机器:

Terminal window
ffmpeg -hide_banner -encoders 2>&1 | Select-String "libx264|libx265|aac"

要用某个 Filter 时同样查:

Terminal window
ffmpeg -hide_banner -filters 2>&1 | Select-String "scale|fps|overlay"

2>&1 把 FFmpeg 写到错误输出的日志并进流水线,Select-String 只留下你关心的名字。

你看到的提示先查什么
不是内部或外部命令没安装,或 bin 不在 PATH
Unknown encoder当前构建没有这个编码器,或名称写错
打不开输入文件路径、权限,以及文件是否存在

命令长什么样

官方骨架可以写成:

ffmpeg [全局选项] [输入选项] -i 输入 [输出选项] 输出

最小例子:

Terminal window
ffmpeg -i input.mp4 output.mkv

拆开看:

ffmpeg 程序
-i input.mp4 输入从哪里来
output.mkv 输出写到哪里
flowchart LR
A[全局选项] --> B[输入选项]
B --> C[-i 输入]
C --> D[输出选项]
D --> E[输出文件]

-i 声明输入,这个例子末尾的路径是输出。扩展名通常用于选择输出容器(Muxer);没有指定 -c 时,FFmpeg 使用该容器注册的默认编码器,所以上面的命令通常会转码。只换容器需要显式写 -c copy。

多数选项要放在它作用的输入或输出旁边。多输入、多输出的作用域到第 04、05 篇再展开。

准备一段测试素材

有自己的短视频时,可将下面各命令中的 input.mp4 换成它的路径。没有素材时,在空目录里生成一段 6 秒测试画面和 440 Hz 测试音:

Terminal window
ffmpeg -n -f lavfi -i "testsrc2=size=640x360:rate=25:duration=6" -f lavfi -i "sine=frequency=440:sample_rate=48000:duration=6" -c:v libx264 -pix_fmt yuv420p -c:a aac input.mp4

testsrc2 和 sine 是官方提供的测试源,-f lavfi 把它们作为输入。这里的尺寸、帧率和时长只是演示设置;-n 防止覆盖同名文件。后面的 1 分钟切片例子需要更长的素材。

第一次查看和播放

Terminal window
ffplay input.mp4

这条命令只播放,不写文件。如果只想读信息,不要依赖 ffmpeg -i 打出来的人类日志,使用:

Terminal window
ffprobe -hide_banner input.mp4

输出里先找 Duration、Stream、视频分辨率和音频编码。字段含义见第 02 篇。

第一次转封装:不改变媒体内容

目标只是换容器,并且目标容器能装原来的流时:

Terminal window
ffmpeg -i input.mp4 -c copy output.mkv

它把自动选中的压缩流写进新容器,不解码、不重新编码。多音轨文件若要保留全部流,需要 -map 0,选流规则见第 04 篇。

这里的 copy 不是编码器名字,而是“复制压缩包”。它通常很快,也不会多一次有损编码;但如果目标容器不支持某条流,复制会失败。

完成后检查容器里到底是什么:

Terminal window
ffprobe -v error -show_format -show_streams -of json output.mkv

第一次转码:改变编码

例如把视频压成 H.264、音频压成 AAC:

Terminal window
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

这条命令会先解码,再按指定编码器重新编码,即使输入已经是 H.264/AAC,也会再次编码。速度、体积和画质取决于编码器和参数;本例要求构建包含 libx264。

不要只改扩展名来“转换格式”。Rename-Item input.mkv output.mp4 只改名字,字节不会变。

别覆盖已有文件

学习时让输出用新文件名最安全。脚本需要明确覆盖策略时:

Terminal window
ffmpeg -n -i input.mp4 -c copy output.mkv
选项输出已存在时
-n失败并退出
-y直接覆盖

两者都不是媒体处理本身的必要参数。本教程示例默认不加 -y。

检查刚生成的文件

Terminal window
ffprobe -v error -show_format -show_streams -of json output.mp4
ffmpeg -v error -i output.mp4 -map 0:v? -map 0:a? -f null -
ffplay output.mp4

先核对编码、尺寸和时长,再检查全部音视频流的解码日志,最后观察画面和声音。-f null - 丢弃输出,不生成另一个媒体文件。出现错误时先保留日志;进程退出码为 0 并不能排除所有媒体错误。

下一篇用容器、编码和 Stream 把 ffprobe 的输出读懂。

依据:FFmpeg 命令行、测试画面源、sine 音频源、下载与构建说明。