FFmpeg常见命令以及解析

发布于:2025-06-19 ⋅ 阅读:(13) ⋅ 点赞:(0)

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)

六、性能优化建议

  1. 使用硬件加速(如 -hwaccel 参数)

  2. 选择合适的 -preset 值平衡速度和质量

  3. 多线程处理(如 -threads 参数)

  4. 对于移动设备,考虑降低分辨率/帧率

  5. 批量处理时注意内存管理

FFmpeg 功能强大,以上只是常用命令的一部分。实际使用时可以根据具体需求组合各种参数和滤镜来实现复杂的媒体处理功能。


网站公告

今日签到

点亮在社区的每一天
去签到