FFmpeg 是一个强大的多媒体处理工具,可以用来处理视频、音频等多种媒体文件。以下是 FFmpeg 的常见命令及其详细解析。
一、基础命令结构
FFmpeg 基本命令格式:
ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...
二、常见命令分类
1. 视频处理
1.1 视频转码
ffmpeg -i input.mp4 output.avi
解析:将 MP4 文件转换为 AVI 格式
1.2 改变视频码率
ffmpeg -i input.mp4 -b:v 1M output.mp4
解析:设置视频码率为 1Mbps
1.3 改变视频分辨率
ffmpeg -i input.mp4 -vf scale=640:480 output.mp4
解析:将视频分辨率调整为 640x480
1.4 裁剪视频
ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
解析:
w
:裁剪宽度h
:裁剪高度x
:裁剪起始X坐标y
:裁剪起始Y坐标
1.5 截取视频片段
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:20 output.mp4
解析:
-ss
:开始时间(1分30秒)-t
:持续时间(20秒)
2. 音频处理
2.1 提取音频
ffmpeg -i input.mp4 -vn -acodec copy output.aac
解析:
-vn
:禁用视频流-acodec copy
:复制音频流不重新编码
2.2 转换音频格式
ffmpeg -i input.mp3 output.ogg
解析:将 MP3 转换为 OGG 格式
2.3 调整音频音量
ffmpeg -i input.mp3 -af "volume=0.5" output.mp3
解析:将音量降低为原来的一半
3. 图像处理
3.1 视频截图
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpg
解析:
-ss
:截图时间点-vframes 1
:截取1帧
3.2 创建视频缩略图
ffmpeg -i input.mp4 -vf fps=1/60 thumbnail-%03d.jpg
解析:每分钟提取1帧作为缩略图
4. 流媒体处理
4.1 RTMP 推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamName
解析:将本地视频推送到 RTMP 服务器
4.2 提取 HLS 流
ffmpeg -i http://example.com/stream.m3u8 -c copy output.mp4
解析:下载 HLS 流并保存为 MP4
三、高级命令
1. 视频滤镜
1.1 添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
解析:在视频(10,10)位置添加水印
1.2 视频旋转
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
解析:
transpose=1
:顺时针旋转90度transpose=2
:逆时针旋转90度
1.3 视频加速/减速
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
解析:速度加快2倍(0.5)
2. 音频滤镜
2.1 音频降噪
ffmpeg -i input.mp3 -af "afftdn=nf=-25" output.mp3
解析:使用FFT降噪
2.2 音频淡入淡出
ffmpeg -i input.mp3 -af "afade=t=in:ss=0:d=5,afade=t=out:st=55:d=5" output.mp3
解析:
5秒淡入
最后5秒淡出(从55秒开始)
3. 复杂滤镜图
3.1 画中画
ffmpeg -i main.mp4 -i sub.mp4 -filter_complex "[1]scale=iw/4:ih/4 [pip]; [0][pip] overlay=main_w-overlay_w-10:10" output.mp4
解析:将第二个视频缩小并叠加到主视频右上角
四、Android 集成示例
1. 使用 mobile-ffmpeg
// 视频转码示例
fun convertVideo(inputPath: String, outputPath: String) {
val cmd = arrayOf(
"-y",
"-i", inputPath,
"-c:v", "libx264",
"-preset", "fast",
"-crf", "22",
"-c:a", "copy",
outputPath
)
FFmpeg.executeAsync(cmd) { executionId, returnCode ->
if (returnCode == RETURN_CODE_SUCCESS) {
Log.i("FFmpeg", "转换成功")
} else {
Log.e("FFmpeg", "转换失败")
}
}
}
2. 视频压缩示例
fun compressVideo(inputPath: String, outputPath: String) {
val cmd = arrayOf(
"-y",
"-i", inputPath,
"-vcodec", "libx264",
"-crf", "28", // 质量参数(18-28,值越大压缩率越高)
"-preset", "fast", // 编码速度与压缩率的平衡
"-acodec", "copy", // 保持原音频
outputPath
)
FFmpeg.execute(cmd)
}
五、常用参数解析
参数 | 说明 |
---|---|
-i |
指定输入文件 |
-c:v |
设置视频编解码器 |
-c:a |
设置音频编解码器 |
-b:v |
设置视频比特率 |
-b:a |
设置音频比特率 |
-r |
设置帧率 |
-s |
设置分辨率 |
-ss |
设置开始时间 |
-t |
设置持续时间 |
-vn |
禁用视频 |
-an |
禁用音频 |
-vf |
设置视频滤镜 |
-af |
设置音频滤镜 |
-y |
覆盖输出文件 |
-preset |
编码预设(ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow) |
六、性能优化建议
使用硬件加速(如
-hwaccel
参数)选择合适的
-preset
值平衡速度和质量多线程处理(如
-threads
参数)对于移动设备,考虑降低分辨率/帧率
批量处理时注意内存管理
FFmpeg 功能强大,以上只是常用命令的一部分。实际使用时可以根据具体需求组合各种参数和滤镜来实现复杂的媒体处理功能。