命令行基础: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 命令行知识体系 ffmpeg [全局参数] [输入参数] -i 输入 [输出参数] 输出 输入部分 处理部分 输出部分 -i 输入文件/流 多输入合并 -c 编解码 -b 码率 -r 帧率 -s 分辨率 -vf 视频滤镜 -af 音频滤镜 输出文件路径 封装格式选择 辅助工具:ffprobe(查看媒体信息) + -h / -version(查看帮助) 核心逻辑:输入 → 处理 → 输出,所有参数都是管道的配置项 遇到问题先查 -h,不确定文件结构先用 ffprobe 实战:组合参数搭建处理管道

这张图把 FFmpeg 命令行的结构拆成了三块:输入、处理、输出。再加上 ffprobe 和帮助系统这两个辅助工具,你就有了完整的工具箱。说白了,以后不管遇到什么音视频处理需求,你都可以先往这个框架里套一套,看看缺什么参数,再查文档补上。

嗯,这一章的内容就到这里。记住命令行结构,记住那五个常用参数,再学会用 ffprobe 看文件信息,你就已经能处理 80% 的日常任务了。剩下的,就是多练、多查、多踩坑——踩过了就记住了。