命令行基础:FFmpeg 命令行结构、常用参数与媒体信息查看
说实话,我刚接触 FFmpeg 那会儿,看着满屏的参数也是一脸懵。但后来我发现,只要搞懂它的命令行结构,剩下的就是往框架里填参数的事。这一章,我就带你把这个框架搭起来。
FFmpeg 命令行结构:一个公式搞定
FFmpeg 的命令行其实就一个核心公式:
ffmpeg [全局参数] [输入参数] -i 输入文件 [输出参数] 输出文件
嗯,就这么简单。你想想看,不管多复杂的命令,都逃不出这个结构。我习惯把它拆成三块:
- 输入部分:告诉 FFmpeg 从哪读数据
- 处理部分:告诉它怎么处理数据
- 输出部分:告诉它把结果写到哪里
举个例子,一个最简单的转码命令:
ffmpeg -i input.mp4 output.avi
这里 -i input.mp4 是输入,output.avi 是输出。中间没加任何处理参数,FFmpeg 就会用默认参数干活。但实际项目中,我们很少这么干——默认参数往往不是最优解。
核心要点:FFmpeg 的命令行结构是「输入 → 处理 → 输出」的管道模型。所有参数都是围绕这个管道来配置的。
常用参数详解:-i, -c, -b, -r, -s
这几个参数是我每天都要用的。咱们一个一个说。
-i:指定输入文件
-i 后面跟输入文件的路径。可以是本地文件,也可以是网络流。我记得有一次项目需要处理 RTSP 摄像头流,命令就是:
ffmpeg -i rtsp://192.168.1.100:554/stream1 output.mp4
这里要注意,-i 可以出现多次,实现多输入。比如把视频和音频合并:
ffmpeg -i video.mp4 -i audio.mp3 -c copy output.mp4
-c:指定编解码器
-c 是 -codec 的缩写,用来选择用什么编解码器处理音视频流。它有两种常见写法:
| 写法 | 含义 | 示例 |
|---|---|---|
-c:v |
指定视频编解码器 | -c:v libx264 用 H.264 编码 |
-c:a |
指定音频编解码器 | -c:a aac 用 AAC 编码 |
-c copy |
直接复制流,不重新编码 | 快速封装格式转换 |
我个人最常用的是 -c copy。为什么?因为不重新编码,速度飞快。比如把 MP4 封装成 MKV,几秒钟就搞定:
ffmpeg -i input.mp4 -c copy output.mkv
小技巧:如果你不确定输入文件里有什么流,先用 ffprobe 看一眼。我每次处理陌生文件都会先跑一下 ffprobe,避免踩坑。
-b:设置码率
-b 控制输出文件的码率,单位是 bit/s。同样分视频和音频:
-b:v 2M:视频码率设为 2 Mbps-b:a 128k:音频码率设为 128 kbps
码率这东西,说白了就是「质量 vs 文件大小」的权衡。码率越高,画质越好,文件也越大。我曾经给客户做过一个视频压缩项目,要求从 50 MB 压到 10 MB 以内。我试了好几组码率,最后用 -b:v 1.5M 才刚好达标。
ffmpeg -i input.mp4 -b:v 1.5M -b:a 96k output.mp4
-r:设置帧率
-r 控制输出视频的帧率,单位是 fps。比如:
ffmpeg -i input.mp4 -r 30 output.mp4
这里有个坑要注意:-r 放在输入文件前面和后面,效果不一样。放在输入前,是「改变输入帧率」;放在输出前,是「改变输出帧率」。我刚开始用的时候就搞混过,结果视频播放速度不对。
避坑指南:我曾经把一个 60fps 的游戏录屏用 -r 30 转码,结果忘了加 -vsync 参数,输出视频卡顿严重。后来查文档才知道,帧率转换时最好配合 -vsync vfr 或 -vsync cfr 使用。
-s:设置分辨率
-s 指定输出视频的分辨率,格式是 宽x高:
ffmpeg -i input.mp4 -s 1280x720 output.mp4
不过直接写死分辨率有个问题——它会强制拉伸画面,导致变形。我一般会先用 ffprobe 看原始分辨率,然后按比例缩放。或者用 scale 滤镜,更灵活:
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease" output.mp4
查看帮助:-h 和 -version
FFmpeg 的帮助系统其实很完善。我遇到不熟的参数,第一反应就是查 -h。
| 命令 | 作用 |
|---|---|
ffmpeg -h |
显示基本帮助信息 |
ffmpeg -h long |
显示更详细的帮助 |
ffmpeg -h full |
显示所有参数(内容很多) |
ffmpeg -h encoder=libx264 |
查看某个编码器的具体参数 |
ffmpeg -version |
查看版本号和编译配置 |
举个例子,我想知道 libx264 编码器支持哪些 preset:
ffmpeg -h encoder=libx264 | grep preset
输出会告诉你 ultrafast、medium、slow、veryslow 等选项。我一般用 medium 做日常转码,追求质量时用 slow。
查看媒体信息:ffprobe
ffprobe 是 FFmpeg 家族里专门用来「看」媒体文件的工具。它不会转码,只是读取并展示文件的元数据。
最基本的用法:
ffprobe input.mp4
输出会显示文件格式、时长、码率、视频流信息(编码、分辨率、帧率)、音频流信息(编码、采样率、声道数)等。
如果你觉得输出太啰嗦,可以用 -show_streams 只看流信息:
ffprobe -show_streams input.mp4
或者用 -v error -show_entries 只提取你关心的字段:
ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate -of default=noprint_wrappers=1 input.mp4
这个命令会输出类似:
[STREAM]
codec_name=h264
width=1920
height=1080
r_frame_rate=30000/1001
[/STREAM]
嗯,30000/1001 其实就是 29.97fps。ffprobe 喜欢用分数表示帧率,习惯就好。
实用技巧:我写脚本时经常用 ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4 来获取视频时长(秒数),然后做自动化处理。
知识体系总览
下面这张图把本章的核心知识点串起来了。你可以把它当作 FFmpeg 命令行的「地图」:
这张图把 FFmpeg 命令行的结构拆成了三块:输入、处理、输出。再加上 ffprobe 和帮助系统这两个辅助工具,你就有了完整的工具箱。说白了,以后不管遇到什么音视频处理需求,你都可以先往这个框架里套一套,看看缺什么参数,再查文档补上。
嗯,这一章的内容就到这里。记住命令行结构,记住那五个常用参数,再学会用 ffprobe 看文件信息,你就已经能处理 80% 的日常任务了。剩下的,就是多练、多查、多踩坑——踩过了就记住了。