3、命令行基础:ffmpeg/ffprobe/ffplay三剑客、命令行结构解析、常用全局参数
说实话,很多新手一上来就急着背参数,结果连命令行都写不对。我见过太多人把输入输出放反,或者漏了关键符号,折腾半天不出片。
这一章,咱们先把地基打牢。FFmpeg 家族有三个成员:ffmpeg(转码主力)、ffprobe(探针工具)、ffplay(播放器)。搞懂它们的分工,你才能对症下药。
核心观点:FFmpeg 的命令行结构只有一句话——ffmpeg [全局参数] [输入参数] -i 输入文件 [输出参数] 输出文件。记住这个骨架,剩下的都是血肉。
3.1 三剑客各司其职
先说说这三个工具分别干什么。
- ffmpeg:编码、转码、滤镜、封装、解封装。说白了,它就是那个干活的。
- ffprobe:查看媒体文件的详细信息。码率、编码器、分辨率、时长……它就像个 X 光机。
- ffplay:一个轻量播放器。调试滤镜、测试参数时特别好用,不用每次都生成完整文件。
我个人习惯,拿到一个陌生视频,先跑 ffprobe 看看底细,再用 ffplay 预览,最后才上 ffmpeg 转码。这样能省不少冤枉时间。
小技巧:用 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 可以输出 JSON 格式的完整信息,方便脚本解析。我在做自动化转码平台时,全靠这个接口抓取源文件参数。
3.2 命令行结构拆解
FFmpeg 的命令行结构其实很规整。咱们拆开看:
ffmpeg [全局参数] [输入参数] -i 输入文件 [输出参数] 输出文件
举个例子:
ffmpeg -y -hwaccel cuda -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4
这里:
-y是全局参数,表示覆盖输出文件而不询问。-hwaccel cuda是输入参数,启用 CUDA 硬件加速解码。-i input.mp4指定输入文件。-c:v h264_nvenc和-b:v 5M是输出参数,指定视频编码器和码率。output.mp4是输出文件。
你想想看,这个结构是不是很清晰?全局参数在最前面,输入参数紧跟着 -i,输出参数在 -i 后面。顺序不能乱,否则 FFmpeg 会报错。
注意:我曾经犯过一个低级错误——把输出参数写在 -i 前面,结果 FFmpeg 把它当成了输入参数,导致转码失败。记住:-i 之前是输入相关,-i 之后是输出相关。
3.3 常用全局参数
全局参数影响整个命令的行为。下面是我工作中最常用的一些:
| 参数 | 作用 | 示例 |
|---|---|---|
-y |
覆盖输出文件,不询问 | ffmpeg -y -i in.mp4 out.mp4 |
-n |
不覆盖输出文件,直接退出 | ffmpeg -n -i in.mp4 out.mp4 |
-loglevel |
控制日志输出级别 | ffmpeg -loglevel debug -i in.mp4 out.mp4 |
-hide_banner |
隐藏编译信息、库版本等 banner | ffmpeg -hide_banner -i in.mp4 out.mp4 |
-stats |
显示编码进度统计(默认开启) | ffmpeg -stats -i in.mp4 out.mp4 |
-benchmark |
显示编码耗时和 CPU 使用情况 | ffmpeg -benchmark -i in.mp4 out.mp4 |
嗯,这里要注意 -loglevel 的级别:quiet、panic、fatal、error、warning、info、verbose、debug、trace。调试时用 debug,生产环境用 error 或 warning,避免刷屏。
我的习惯:写脚本时,我会用 -loglevel error -hide_banner -stats 组合。既能看到进度,又不会被无关信息干扰。如果遇到奇怪的问题,再切到 debug 级别看详细日志。
3.4 三剑客协作流程图
下面这张图展示了我日常工作中三剑客的协作流程:
你看,这个流程其实很自然。拿到一个视频,先用 ffprobe 摸清底细,如果对滤镜效果没把握,就用 ffplay 实时预览,确认无误后再用 ffmpeg 正式转码。我建议你也养成这个习惯,能少踩很多坑。
3.5 实战:用三剑客排查问题
有一次,用户反馈转码后的视频画面有绿边。我第一反应不是去改参数,而是先跑 ffprobe:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,sample_aspect_ratio,display_aspect_ratio -of default=noprint_wrappers=1 input.mp4
结果发现源视频的 SAR(样本宽高比)是 4:3,但 DAR(显示宽高比)被标记成了 16:9。这就是绿边的根源——像素不是方形的。用 ffplay 加上 -vf "setsar=1" 预览,绿边消失了。最后在 ffmpeg 里加上 -vf "setsar=1,scale=1920:1080",问题解决。
总结一下:三剑客不是孤立的工具,而是一套工作流。ffprobe 负责诊断,ffplay 负责验证,ffmpeg 负责执行。搞懂命令行结构,用好全局参数,你就能像外科医生一样精准操作。