FFmpeg 入门:命令行的 20 个常用场景
做音视频开发绕不开的工具就是 FFmpeg。不管你是做 IPC 摄像头、直播、视频剪辑还是售货柜视觉识别,FFmpeg 都是工具箱里的瑞士军刀。这篇从安装到常用命令,一次性把最常用的 20 个场景讲清楚,新手看完就能上手干活。
大家好,我是黒漂技术佬。
之前写 IPC 摄像头、RTSP 拉流、流媒体服务的时候,很多人问我:视频帧怎么抽出来给 YOLO 识别?RTSP 流怎么存成文件?摄像头录像怎么转成 MP4?这些问题的答案,基本都指向同一个工具------FFmpeg。
这是「FFmpeg 音视频处理实战」系列第一篇,先从最基础的命令行讲起,20 个场景覆盖 80% 的日常需求。
一、FFmpeg 是什么?
简单说,FFmpeg 是一套音视频处理的开源工具集,包含:
- ffmpeg:命令行工具,用来转码、剪辑、推流
- ffplay:简易播放器,用来快速播放音视频
- ffprobe:媒体信息分析工具,查看视频编码、分辨率、码率等
- 开发库:libavcodec、libavformat、libavfilter 等,供程序调用(后面 SDK 开发篇会讲)
为什么叫 FFmpeg?Fast Forward Moving Picture Experts Group------翻译过来就是「快进的运动图像专家组」。诞生于 2000 年,至今 20 多年,是音视频领域的事实标准。
💡 一句话:只要和音视频沾边的事,FFmpeg 基本都能干。
二、安装
Windows
去官网下载编译好的版本:ffmpeg.org/download.html
或者更简单,用 winget:
powershell
winget install ffmpeg
安装完验证:
powershell
ffmpeg -version
Linux (Ubuntu/Debian)
bash
sudo apt update
sudo apt install ffmpeg
macOS
bash
brew install ffmpeg
⚠️ 踩坑提醒:很多系统自带的 FFmpeg 版本很老,编码器不全(比如没有 libx264)。建议从官网下载完整版,或者自己编译带全功能的版本。后面讲硬件加速的时候会详细说。
三、命令基本格式
FFmpeg 命令长这样:
bash
ffmpeg [输入参数] -i 输入文件 [输出参数] 输出文件
核心逻辑:左边输入,右边输出,中间是滤镜和编码参数。
举个最简单的例子------把 MP4 转成 AVI:
bash
ffmpeg -i input.mp4 output.avi
就这么一行。FFmpeg 会自动根据文件后缀选择编码器,非常智能。
四、20 个常用场景
我按用途分成 6 类,日常工作 80% 的需求都在里面。
第一类:查看信息
1. 查看媒体文件信息
bash
ffprobe input.mp4
或者更简洁的 JSON 格式:
bash
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
能看到:时长、分辨率、编码格式、码率、帧率、音频采样率、声道数......所有元数据。
做 IPC 摄像头开发的时候,我经常用 ffprobe 先看 RTSP 流的编码参数,确认是 H.264 还是 H.265、分辨率多少,省得后面踩坑。
第二类:格式转换
2. MP4 转 AVI / MKV / MOV
bash
ffmpeg -i input.mp4 output.avi
ffmpeg -i input.mp4 output.mkv
ffmpeg -i input.mp4 output.mov
改后缀就行,FFmpeg 自动选封装格式。
3. 视频转 GIF
bash
ffmpeg -i input.mp4 output.gif
但默认生成的 GIF 质量很差,推荐加参数:
bash
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1" -loop 0 output.gif
fps=10:每秒 10 帧scale=480:-1:宽度 480,高度等比例缩放-loop 0:无限循环
4. 提取音频(MP4 转 MP3)
bash
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
-vn:video no,去掉视频流-q:a 2:MP3 质量,0 最好,9 最差,2 是性价比最高的
5. 音频格式互转(WAV、AAC、FLAC)
bash
ffmpeg -i input.wav output.aac
ffmpeg -i input.mp3 output.flac
第三类:视频处理
6. 压缩视频(减小文件体积)
bash
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4
-crf 28:Constant Rate Factor,质量恒定模式。数值越大体积越小、质量越差。常用范围 18-28,23 是默认值。- 一般我压短视频发微信,用 crf 28,体积能减一半,肉眼基本看不出差别。
7. 修改分辨率
bash
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
等比例缩放,高度自动算:
bash
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
8. 裁剪视频画面
bash
ffmpeg -i input.mp4 -vf "crop=宽:高:起始x:起始y" output.mp4
比如从 1920×1080 的视频里裁出中间 1080×1080 的正方形:
bash
ffmpeg -i input.mp4 -vf "crop=1080:1080:420:0" output.mp4
售货柜项目里,摄像头拍的是整个柜子,但我只关心货架那一块,就用 crop 裁掉多余区域,YOLO 识别速度能快不少。
9. 旋转视频
bash
# 顺时针 90 度
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# 逆时针 90 度
ffmpeg -i input.mp4 -vf "transpose=2" output.mp4
# 旋转 180 度
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
10. 加水印
文字水印:
bash
ffmpeg -i input.mp4 -vf "drawtext=text='黒漂技术佬':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
图片水印:
bash
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
右下角水印:
bash
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
W 和 H 是视频宽高,w 和 h 是水印图片宽高。
第四类:音频处理
11. 提取单声道 / 调整声道
bash
# 立体声转单声道
ffmpeg -i input.mp3 -ac 1 output_mono.mp3
# 单声道转立体声
ffmpeg -i input_mono.mp3 -ac 2 output_stereo.mp3
12. 调整音量
bash
# 音量加倍
ffmpeg -i input.mp3 -af "volume=2" output.mp3
# 音量减半
ffmpeg -i input.mp3 -af "volume=0.5" output.mp3
13. 音频降噪
bash
ffmpeg -i input.mp3 -af "afftdn=nf=-20" output.mp3
afftdn 是音频频域降噪滤波器,nf=-20 是降噪强度,数值越小降噪越强。
第五类:截取与拼接
14. 截取片段(剪视频)
从第 30 秒开始,剪 10 秒钟:
bash
ffmpeg -i input.mp4 -ss 00:00:30 -t 10 output.mp4
-ss:开始时间,格式可以是秒数或时:分:秒-t:持续时长(秒)
或者用 -to 指定结束时间:
bash
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:40 output.mp4
⚠️ 踩坑提醒 :
-ss放在-i前面是输入级 seek(快但不准),放在-i后面是输出级 seek(准但慢)。追求精确剪辑放后面,追求速度放前面。
15. 拼接多个视频
先建一个文件列表 filelist.txt:
file '001.mp4'
file '002.mp4'
file '003.mp4'
然后:
bash
ffmpeg -f concat -i filelist.txt -c copy output.mp4
-c copy 是直接复制流,不重新编码,速度极快。前提是所有视频的编码参数必须一致。
第六类:抽帧与截图
16. 截一张图(指定时间点)
第 10 秒截一张:
bash
ffmpeg -i input.mp4 -ss 10 -vframes 1 screenshot.jpg
17. 按间隔抽帧(每秒一张)
bash
ffmpeg -i input.mp4 -vf fps=1 frames/%04d.jpg
fps=1:每秒 1 帧%04d.jpg:输出文件名,4 位数字序号(0001.jpg、0002.jpg......)
每 10 秒抽一张:
bash
ffmpeg -i input.mp4 -vf fps=1/10 frames/%04d.jpg
这个命令我在做售货柜 YOLO 数据集的时候天天用------从 IPC 录像里抽几千张图出来标注,比手动截图效率高十倍。
18. 生成缩略图(每隔一段时间一张拼图)
bash
ffmpeg -i input.mp4 -vf "fps=1/30,scale=320:-1,tile=4x5" thumbnail.jpg
每 30 秒抽一张,缩到宽 320,拼成 4×5 的网格图,一张图预览整个视频。
第七类:直播推流拉流
19. RTSP 流转 RTMP 推流
bash
ffmpeg -i rtsp://摄像头地址 -c copy -f flv rtmp://推流地址/live/流名
IPC 摄像头是 RTSP,直播平台要 RTMP,用 FFmpeg 一转就通了。
20. RTSP 流存成文件(边录边存)
bash
ffmpeg -i rtsp://摄像头地址 -c copy -segment_time 3600 -f segment output_%03d.mp4
-segment_time 3600:每 3600 秒(1 小时)切一个文件- 自动分片,适合摄像头 24 小时录像
五、常用参数速查表
| 参数 | 作用 |
|---|---|
-i |
指定输入文件 |
-c copy |
直接复制流,不重新编码(速度快) |
-vcodec libx264 |
视频用 H.264 编码 |
-acodec aac |
音频用 AAC 编码 |
-crf 23 |
H.264 质量参数(18-28 常用) |
-b:v 2M |
视频码率 2Mbps |
-b:a 128k |
音频码率 128kbps |
-vf |
视频滤镜(缩放、裁剪、水印等) |
-af |
音频滤镜(音量、降噪等) |
-ss |
开始时间 |
-t |
持续时长 |
-r 30 |
帧率 30fps |
-s 1920x1080 |
分辨率 |
-vn |
去掉视频流 |
-an |
去掉音频流 |
-y |
覆盖输出文件不询问 |
六、新手最容易踩的三个坑
坑 1:参数顺序很重要
FFmpeg 的参数是位置敏感 的------放在 -i 前面的是输入参数,放在输出文件名前面的是输出参数。
bash
# 正确:-ss 放在 -i 前面,输入级快速 seek
ffmpeg -ss 10 -i input.mp4 -t 5 output.mp4
# 也对:-ss 放在后面,输出级精确 seek
ffmpeg -i input.mp4 -ss 10 -t 5 output.mp4
但滤镜参数必须放在对应输出的前面,乱放会报错。
坑 2:编码 vs 复制流
-c copy 速度极快,但前提是你不需要改视频内容。一旦加了滤镜(缩放、裁剪、水印),就必须重新编码,不能用 copy。
坑 3:默认编码器可能不全
很多精简版 FFmpeg 没有 libx264、libfdk_aac 这些编码器,转出来的视频质量差或者直接报错。遇到「Unknown encoder 'libx264'」,去下个完整版或者自己编译。
七、本篇小结
- FFmpeg 是音视频领域的瑞士军刀,命令行就能搞定 80% 的日常需求
- 基本格式:
ffmpeg -i 输入 [参数] 输出 - 最常用的就那十几个参数:
-c copy、-crf、-vf、-ss、-t - 抽帧、转码、推流、裁剪------这些场景命令行直接搞定,不用写代码
下一篇讲视频转码详解:封装格式、编码器、码率控制、CRF 和 CBR 到底选哪个------把视频压缩这件事彻底讲明白。
我是黒漂技术佬,下篇见。