1. 为什么需要FFmpeg CLI命令速查表
在音视频开发领域,FFmpeg就像是一把瑞士军刀,几乎能解决所有音视频处理需求。但它的命令行参数之多、组合方式之复杂,常常让开发者望而生畏。我至今记得第一次使用FFmpeg时,为了把一个MP4文件转成GIF,花了整整两小时查阅各种文档。
FFmpeg官方文档列出了超过400个命令行参数选项,这还不包括各种滤镜和编码器的专属参数。在实际开发中,我们经常需要快速查阅某个具体功能的命令行写法,比如:
- 如何裁剪视频的特定时间段?
- 如何调整视频分辨率?
- 如何提取音频流?
- 如何合并多个视频文件?
这就是为什么我们需要一个精心整理的CLI命令速查表。好的速查表应该:
- 覆盖80%的日常使用场景
- 参数解释清晰明了
- 提供典型用例示例
- 按照功能模块分类
注意:FFmpeg命令在不同版本间可能存在差异,本文示例基于FFmpeg 5.x版本,建议读者使用相同或更高版本以获得最佳兼容性。
2. FFmpeg基础命令结构解析
2.1 命令组成要素
一个完整的FFmpeg命令通常包含以下部分:
bash复制ffmpeg [全局参数] [输入文件参数] -i 输入文件 [输出文件参数] 输出文件
各部分的作用:
- 全局参数:影响整个FFmpeg进程的行为,如日志级别(-loglevel)、覆盖输出文件(-y)等
- 输入文件参数:针对特定输入文件的处理参数
- -i:指定输入文件(可多次使用以处理多个输入)
- 输出文件参数:控制输出文件的编码、格式等
- 输出文件:最终生成的文件
2.2 常用全局参数
| 参数 | 说明 | 示例 |
|---|---|---|
| -y | 自动覆盖输出文件 | ffmpeg -y -i input.mp4 output.avi |
| -n | 不覆盖已存在文件 | ffmpeg -n -i input.mp4 output.avi |
| -loglevel | 设置日志级别 | ffmpeg -loglevel warning -i input.mp4 output.avi |
| -stats | 显示进度统计 | ffmpeg -stats -i input.mp4 output.avi |
| -hide_banner | 隐藏版本信息 | ffmpeg -hide_banner -i input.mp4 output.avi |
3. 音视频转换与编码命令
3.1 基础格式转换
最简单的格式转换命令:
bash复制ffmpeg -i input.mp4 output.avi
这会将MP4文件转换为AVI格式,使用默认编码参数。但实际工作中我们通常需要更精确的控制:
bash复制ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 128k output.mp4
参数说明:
- -c:v libx264:使用H.264视频编码器
- -crf 23:质量参数(18-28,值越小质量越高)
- -preset fast:编码速度与压缩率的平衡
- -c:a aac:使用AAC音频编码
- -b:a 128k:音频比特率128kbps
3.2 视频编码参数调整
调整视频质量的常用参数组合:
bash复制ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level 4.1 -x264-params ref=4 -movflags +faststart output.mp4
关键参数:
- -profile:v:编码配置文件(baseline, main, high)
- -level:编码级别
- -x264-params:直接传递参数给x264编码器
- -movflags +faststart:优化网络播放
3.3 音频编码参数调整
音频处理示例:
bash复制ffmpeg -i input.mp4 -c:v copy -c:a libmp3lame -q:a 2 output.mp4
参数说明:
- -c:v copy:视频流直接复制不重新编码
- -c:a libmp3lame:使用MP3编码器
- -q:a 2:音频质量(0-9,值越小质量越高)
4. 音视频编辑操作命令
4.1 裁剪与截取
截取视频片段:
bash复制ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:30 -c copy output.mp4
参数说明:
- -ss:开始时间点
- -t:持续时间
- -c copy:使用流复制模式(不重新编码)
精确到帧的裁剪:
bash复制ffmpeg -i input.mp4 -ss 00:01:30.500 -to 00:02:00.750 -c copy output.mp4
4.2 调整分辨率与帧率
调整视频分辨率:
bash复制ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
保持宽高比自动调整:
bash复制ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4
修改帧率:
bash复制ffmpeg -i input.mp4 -r 30 output.mp4
4.3 提取音视频流
提取视频流(无音频):
bash复制ffmpeg -i input.mp4 -an -c:v copy output.mp4
提取音频流(无视频):
bash复制ffmpeg -i input.mp4 -vn -c:a copy output.aac
提取特定音轨:
bash复制ffmpeg -i input.mkv -map 0:a:1 -c:a copy output.aac
5. 高级处理与滤镜应用
5.1 常用视频滤镜
添加水印:
bash复制ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
调整亮度/对比度:
bash复制ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" output.mp4
添加文字:
bash复制ffmpeg -i input.mp4 -vf "drawtext=text='Sample Text':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
5.2 音频滤镜应用
调整音量:
bash复制ffmpeg -i input.mp4 -af "volume=1.5" output.mp4
降噪处理:
bash复制ffmpeg -i input.mp3 -af "afftdn=nf=-20" output.mp3
淡入淡出效果:
bash复制ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=5,afade=t=out:st=30:d=5" output.mp3
5.3 复杂滤镜图
多滤镜组合:
bash复制ffmpeg -i input.mp4 -vf "scale=1280:720,transpose=1,hflip" output.mp4
多输入处理:
bash复制ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" -map 0:a output.mp4
6. 流媒体与特殊格式处理
6.1 RTMP流处理
推流到RTMP服务器:
bash复制ffmpeg -re -i input.mp4 -c copy -f flv "rtmp://server/live/streamkey"
从RTMP拉流:
bash复制ffmpeg -i "rtmp://server/live/streamkey" -c copy output.flv
6.2 HLS流处理
生成HLS切片:
bash复制ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8
参数说明:
- -hls_time:每个切片时长(秒)
- -hls_list_size:播放列表中的切片数量(0表示全部)
6.3 GIF处理
视频转GIF:
bash复制ffmpeg -i input.mp4 -vf "fps=15,scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
优化GIF质量:
bash复制ffmpeg -i input.mp4 -vf "fps=10,scale=500:-1:flags=lanczos" -c:v gif -f gif - | gifsicle --optimize=3 --delay=10 > output.gif
7. 实用技巧与排错指南
7.1 性能优化技巧
硬件加速编码(NVIDIA):
bash复制ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset fast output.mp4
多线程处理:
bash复制ffmpeg -threads 4 -i input.mp4 -c:v libx264 -preset fast output.mp4
7.2 常见问题排查
"Invalid data found when processing input"错误:
- 检查文件是否完整
- 尝试强制指定输入格式:
bash复制ffmpeg -f mp4 -i input.mp4 output.avi
"Codec not supported"错误:
- 查看支持的编码器:
ffmpeg -codecs - 安装额外编码器或重新编译FFmpeg
7.3 信息查看命令
查看媒体文件信息:
bash复制ffmpeg -i input.mp4
查看可用设备:
bash复制ffmpeg -devices
查看支持的格式:
bash复制ffmpeg -formats
查看支持的编码器:
bash复制ffmpeg -codecs
8. 实际工作流示例
8.1 视频处理完整流程
典型工作流:
- 检查媒体信息
- 提取关键片段
- 调整分辨率/帧率
- 添加水印/字幕
- 转码为目标格式
- 生成多种输出(如HLS)
示例命令:
bash复制ffmpeg -i raw.mp4 \
-ss 00:01:00 -to 00:02:30 \
-vf "scale=1280:720,fps=30,drawtext=text='Copyright':x=10:y=10:fontsize=24:fontcolor=white" \
-c:v libx264 -crf 23 -preset fast \
-c:a aac -b:a 128k \
-f hls -hls_time 10 -hls_list_size 0 output.m3u8
8.2 批量处理脚本
Linux/Mac下的批量转码脚本:
bash复制#!/bin/bash
for file in *.mov; do
ffmpeg -i "$file" -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 128k "${file%.*}.mp4"
done
Windows批处理脚本:
batch复制@echo off
for %%f in (*.mov) do (
ffmpeg -i "%%f" -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 128k "%%~nf.mp4"
)
8.3 自动化质量检查
检查视频关键帧间隔:
bash复制ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv input.mp4 | grep -n I-frame
检查音频峰值:
bash复制ffmpeg -i input.mp3 -af "astats=metadata=1:reset=1" -f null - 2>&1 | grep "Peak level"
在实际项目中,我通常会将这些常用命令保存为脚本或Makefile目标,配合shell脚本实现自动化处理流水线。比如一个典型的视频处理流水线可能包含:原始素材检查→自动剪辑→转码→质量验证→分发打包等步骤,每个步骤都可以用FFmpeg命令实现。
