FFmpeg 常用命令详解与实战 – wiki大全

FFmpeg 常用命令详解与实战

FFmpeg 是一个功能强大、开源且跨平台的多媒体处理框架,能够处理音频、视频, 字幕等多种媒体格式。它包含了大量的库和工具,可以用于视频转换、流媒体传输、视频截取、滤镜处理等多种任务。无论是专业的音视频开发者,还是日常需要处理媒体文件的用户,FFmpeg 都是一个不可或缺的工具。

本文将详细介绍 FFmpeg 的常用命令及其在实际应用中的使用方法,帮助您更好地理解和掌握 FFmpeg。

FFmpeg 基本命令格式

FFmpeg 的基本命令格式遵循一个统一的结构:

bash
ffmpeg [全局选项] [输入文件选项] -i <输入文件> [输出文件选项] <输出文件>

  • -i <输入文件>: 用于指定输入文件,可以指定多个输入文件。
  • [全局选项]: 影响整个 FFmpeg 进程的选项,例如 -hide_banner 用于隐藏 FFmpeg 启动时的版权和配置信息。
  • [输入文件选项]: 仅应用于紧随其后的输入文件的选项。
  • [输出文件选项]: 仅应用于紧随其后的输出文件的选项。
  • <输出文件>: 指定输出文件。

常用全局参数:

  • -hide_banner: 隐藏 FFmpeg 启动时显示的版权和配置信息,使输出更简洁。
  • -y: 覆盖已存在的输出文件,不再进行提示询问,适合自动化脚本。
  • -n: 不覆盖输出文件,如果文件已存在则立即退出,用于防止意外覆盖。

常用命令详解与实战

1. 格式转换

格式转换是 FFmpeg 最核心和最常用的功能之一,可以将视频或音频文件从一种格式转换为另一种格式。

视频格式转换

input.flv 转换为 output.mp4。如果未指定编解码器,FFmpeg 会自动选择合适的编解码器。

bash
ffmpeg -i input.flv output.mp4

显式指定视频编码器为 H.264 (libx264),音频编码器为 AAC (aac)。这在需要控制输出质量和兼容性时非常有用。

bash
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4

  • -c:v: 指定视频编码器。
  • -c:a: 指定音频编码器。
  • copy: 表示直接复制流,不进行重新编码。这种方式速度快且无损,但要求输出容器支持该流格式。

bash
ffmpeg -i input.avi -c copy output.mp4 # 无损快速转换封装格式

音频格式转换

input.wav 转换为 output.mp3,并指定音频比特率为 192kbps。

bash
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3

  • -b:a: 设置音频比特率,影响音频质量和文件大小。

视频提取音频

从视频 input.mp4 中提取音频并保存为 output.mp3

bash
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3

  • -vn: 禁用视频流处理,只提取音频。
  • -q:a 2: 指定音频质量,0 为最高质量,9 为最低质量。

2. 视频剪辑/截取

FFmpeg 可以精确地剪辑视频片段。

按起始时间和持续时间剪辑 (快速无重编码)

input.mp4 的第 30 秒开始,截取 10 秒的视频,并复制流(无重编码)。将 -ss 放在 -i 前面可以实现快速定位,但可能不精确到帧。

bash
ffmpeg -ss 00:00:30 -i input.mp4 -t 00:00:10 -c copy output.mp4

  • -ss <时间>: 指定起始时间,格式可以是 HH:MM:SS 或秒数。
  • -t <持续时间>: 指定截取的持续时间。

按起始时间和结束时间剪辑 (快速无重编码)

input.mp4 的第 30 秒开始,到第 40 秒结束,复制流。

bash
ffmpeg -ss 00:00:30 -i input.mp4 -to 00:00:40 -c copy output.mp4

  • -to <结束时间>: 指定结束时间。

帧精确剪辑 (重编码)

input.mp4 的第 30 秒开始,截取 10 秒的视频,并进行重编码以确保帧精确。如果需要精确到每一帧,通常需要进行重编码。

bash
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:10 -c:v libx264 -c:a aac output.mp4

3. 视频处理

调整视频分辨率/缩放

input.mp4 缩放到 640×480 分辨率。

bash
ffmpeg -i input.mp4 -vf scale=640:480 output.mp4

  • -vf: 应用视频滤镜。scale 是一个常用的视频滤镜。

改变视频帧率

input.mp4 的帧率改为 25 fps。

bash
ffmpeg -i input.mp4 -r 25 output.mp4

  • -r: 设置帧率 (frames per second)。

从视频中提取图片

input.mp4 中提取第一帧并保存为 output.jpg

bash
ffmpeg -i input.mp4 -vframes 1 output.jpg

  • -vframes <数量>: 设置要输出的视频帧数。

从视频中每隔 5 秒提取一张图片。

bash
ffmpeg -i input.mp4 -vf fps=1/5 output_%03d.jpg

  • fps=1/5: 表示每 5 秒提取一帧。output_%03d.jpg 会生成 output_001.jpg, output_002.jpg 等文件。

4. 音频处理

调整音频音量

input.wav 的音量减半。

bash
ffmpeg -i input.wav -af 'volume=0.5' output.wav

  • -af: 应用音频滤镜。volume 是一个常用的音频滤镜。

改变音频采样率

input.wav 的采样率改为 44100 Hz (CD 质量)。

bash
ffmpeg -i input.wav -ar 44100 output.wav

  • -ar: 设置音频采样率。

改变音频声道数

input.wav 转换为单声道。

bash
ffmpeg -i input.wav -ac 1 output.wav

  • -ac: 设置声道数,1 为单声道,2 为立体声。

5. 合并/拼接

合并多个视频/音频文件 (相同编码参数)

如果多个文件的编码参数(编解码器、分辨率、帧率等)都相同,可以使用 concat 协议进行快速合并,无需重编码。

首先,创建一个文本文件,例如 mylist.txt,列出要合并的文件:

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

然后执行合并命令:

bash
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

  • -f concat: 指定使用 concat 协议进行文件合并。
  • -safe 0: 允许使用不安全的外部文件路径。
  • -c copy: 复制流,不进行重编码,速度快。

6. 获取媒体文件信息

虽然 ffmpeg 命令本身可以输出一些信息,但 ffprobe 工具更适合用于获取详细的媒体文件信息。ffprobe 是 FFmpeg 套件中的另一个实用工具。

bash
ffprobe input.mp4

这将显示视频的封装格式、视频流、音频流、编码器、比特率、时长等详细信息,对于分析媒体文件非常有用。

常用参数速查

参数 描述
-i 指定输入文件
-f 指定输入或输出格式
-ss 起始时间 (如 00:00:3030)
-t 持续时长 (如 00:00:1010)
-to 结束时间 (如 00:00:4040)
-c 指定编解码器 (全局)
-c:v 指定视频编解码器
-c:a 指定音频编解码器
copy 复制流,不重编码
-vn 禁用视频流 (只处理音频)
-an 禁用音频流 (只处理视频)
-r 设置视频帧率 (fps)
-s 设置视频分辨率 (如 1920x1080)
-b:v 设置视频比特率 (如 2M, 500k)
-b:a 设置音频比特率 (如 192k, 320k)
-ar 设置音频采样率 (如 44100, 48000)
-ac 设置音频声道数 (如 1 为单声道,2 为立体声)
-vf 应用视频滤镜
-af 应用音频滤镜
-y 覆盖输出文件,不询问
-hide_banner 隐藏 FFmpeg 启动信息

总结

FFmpeg 是一个极其强大的多媒体工具,其灵活性和丰富的功能使其成为音视频处理领域的瑞士军刀。通过灵活运用其各种命令和参数,您可以完成从简单的格式转换到复杂的音视频处理任务,例如视频剪辑、分辨率调整、音频提取、文件合并等。掌握这些常用命令将大大提高您处理媒体文件的效率,并为您的多媒体项目提供无限可能。希望本文能帮助您更好地理解和使用 FFmpeg。

滚动至顶部