打开终端后,先确认程序能运行,再用一段短视频完成探测、转封装和转码。命令按 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 -. 提供编码和流的事实 .-> Fffprobe 用来核对结构,ffplay 用来观察播放效果;两种检查回答的问题不同。
检查安装和能力
ffmpeg -versionffprobe -versionffplay -version三条都能返回版本,说明程序在 PATH 里。版本信息里的构建配置决定了有哪些编码器、Filter 和协议。要用某个编码器前,先问当前机器:
ffmpeg -hide_banner -encoders 2>&1 | Select-String "libx264|libx265|aac"要用某个 Filter 时同样查:
ffmpeg -hide_banner -filters 2>&1 | Select-String "scale|fps|overlay"2>&1 把 FFmpeg 写到错误输出的日志并进流水线,Select-String 只留下你关心的名字。
| 你看到的提示 | 先查什么 |
|---|---|
| 不是内部或外部命令 | 没安装,或 bin 不在 PATH |
Unknown encoder | 当前构建没有这个编码器,或名称写错 |
| 打不开输入文件 | 路径、权限,以及文件是否存在 |
命令长什么样
官方骨架可以写成:
ffmpeg [全局选项] [输入选项] -i 输入 [输出选项] 输出最小例子:
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 测试音:
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.mp4testsrc2 和 sine 是官方提供的测试源,-f lavfi 把它们作为输入。这里的尺寸、帧率和时长只是演示设置;-n 防止覆盖同名文件。后面的 1 分钟切片例子需要更长的素材。
第一次查看和播放
ffplay input.mp4这条命令只播放,不写文件。如果只想读信息,不要依赖 ffmpeg -i 打出来的人类日志,使用:
ffprobe -hide_banner input.mp4输出里先找 Duration、Stream、视频分辨率和音频编码。字段含义见第 02 篇。
第一次转封装:不改变媒体内容
目标只是换容器,并且目标容器能装原来的流时:
ffmpeg -i input.mp4 -c copy output.mkv它把自动选中的压缩流写进新容器,不解码、不重新编码。多音轨文件若要保留全部流,需要 -map 0,选流规则见第 04 篇。
这里的 copy 不是编码器名字,而是“复制压缩包”。它通常很快,也不会多一次有损编码;但如果目标容器不支持某条流,复制会失败。
完成后检查容器里到底是什么:
ffprobe -v error -show_format -show_streams -of json output.mkv第一次转码:改变编码
例如把视频压成 H.264、音频压成 AAC:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4这条命令会先解码,再按指定编码器重新编码,即使输入已经是 H.264/AAC,也会再次编码。速度、体积和画质取决于编码器和参数;本例要求构建包含 libx264。
不要只改扩展名来“转换格式”。Rename-Item input.mkv output.mp4 只改名字,字节不会变。
别覆盖已有文件
学习时让输出用新文件名最安全。脚本需要明确覆盖策略时:
ffmpeg -n -i input.mp4 -c copy output.mkv| 选项 | 输出已存在时 |
|---|---|
-n | 失败并退出 |
-y | 直接覆盖 |
两者都不是媒体处理本身的必要参数。本教程示例默认不加 -y。
检查刚生成的文件
ffprobe -v error -show_format -show_streams -of json output.mp4ffmpeg -v error -i output.mp4 -map 0:v? -map 0:a? -f null -ffplay output.mp4先核对编码、尺寸和时长,再检查全部音视频流的解码日志,最后观察画面和声音。-f null - 丢弃输出,不生成另一个媒体文件。出现错误时先保留日志;进程退出码为 0 并不能排除所有媒体错误。
下一篇用容器、编码和 Stream 把 ffprobe 的输出读懂。
评论