FFmpeg 视频剪辑常用命令

FFmpeg 视频剪辑常用命令

FFmpeg 视频剪辑常用命令

FFmpeg 是一个开源的跨平台音视频处理工具,功能强大且灵活。以下是一些视频剪辑工作中非常实用的命令:

1. 格式转换 (Converting Formats)

这是最基本也是最常见的需求,例如将 MP4 转换为 MOV,或者反过来。

ffmpeg -i input.mp4 output.mov
ffmpeg -i input.mov output.mp4
  • -i input.mp4: 指定输入文件。input.mp4 是你的源文件名。
  • output.mov: 指定输出文件。FFmpeg 会根据扩展名自动判断目标格式。

如果你需要指定特定的视频和音频编码器:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mov
  • -c:v libx264: 使用 H.264 视频编码器 (非常常用)。
  • -c:a aac: 使用 AAC 音频编码器 (也很常用)。

2. 改变视频尺寸 (Resizing)

调整视频的分辨率,例如将视频缩放到 720p。

ffmpeg -i input.mp4 -vf scale=1280:720 output_720p.mp4
  • -vf scale=1280:720: 使用视频滤镜 (video filter) scale1280 是宽度,720 是高度。
  • 保持宽高比缩放 (例如,指定宽度为 1280,高度自动计算):ffmpeg -i input.mp4 -vf scale=1280:-1 output_scaled.mp4
  • 保持宽高比缩放 (例如,指定高度为 720,宽度自动计算):ffmpeg -i input.mp4 -vf scale=-1:720 output_scaled.mp4

3. 裁剪视频片段 (Cutting/Trimming)

从视频中精确提取某一段。

从指定时间点开始,截取特定时长:

ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:15 -c copy output_segment.mp4
  • -ss 00:01:30: ss (seek start) 指定开始时间,格式为 HH:MM:SS 或秒数。这里是从 1 分 30 秒开始。
  • -t 00:00:15: t (duration) 指定截取的时长,格式同上。这里是截取 15 秒。
  • -c copy: (可选但推荐,如果不需要重新编码) 直接复制视频和音频流,速度非常快,但 -ss 的定位可能不完全精确到帧(会定位到最近的关键帧)。

指定开始时间和结束时间进行裁剪 (可能需要重新编码以保证精确):

ffmpeg -i input.mp4 -ss 00:01:30 -to 00:01:45 -c:v libx264 -c:a aac output_segment_precise.mp4
  • -to 00:01:45: to 指定结束时间点。
  • 为了精确裁剪,通常省略 -c copy,让 FFmpeg 重新编码。

快速但不精确的裁剪 (使用输入选项 -ss):

如果将 -ss 放在 -i 之前,FFmpeg 会先跳转再解码,速度更快,但精确度较低。

ffmpeg -ss 00:01:30 -i input.mp4 -t 00:00:15 -c copy output_segment_fast.mp4

4. 合并多个视频 (Concatenating/Merging)

将多个视频文件拼接成一个。

方法一:如果所有视频的编码参数 (分辨率、帧率、格式等) 完全相同 (推荐此方法,速度快):

  1. 创建一个文本文件 (例如 mylist.txt),列出所有要合并的文件:file 'clip1.mp4' file 'clip2.mp4' file 'clip3.mp4'
  2. 运行 FFmpeg 命令:ffmpeg -f concat -safe 0 -i mylist.txt -c copy output_merged.mp4
    • -f concat: 使用 concat demuxer。
    • -safe 0: 如果文件名包含特殊字符或绝对路径,需要此选项。
    • -c copy: 直接复制流,不重新编码。

方法二:如果视频编码参数不同 (需要重新编码,较慢):

ffmpeg -i clip1.mp4 -i clip2.mp4 -i clip3.mp4 \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output_merged_recode.mp4
  • 这个命令使用 filter_complex 来处理不同编码的视频。
  • [0:v:0][0:a:0] 指的是第一个输入文件 (clip1.mp4) 的视频流和音频流。
  • concat=n=3:v=1:a=1 表示有 3 个输入文件,输出 1 个视频流和 1 个音频流。
  • [outv][outa] 是合并后输出的视频和音频流的标签。

5. 提取音频 (Extracting Audio)

从视频文件中分离出音频,例如保存为 MP3 或 AAC。

ffmpeg -i input.mp4 -vn -acodec copy output_audio.aac
  • -vn: (video no) 禁用视频录制,即不输出视频。
  • -acodec copy: 直接复制音频流,不重新编码。输出格式由 output_audio.aac 的扩展名决定。
    • 如果想转换为 MP3:ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output_audio.mp3
      • -c:a libmp3lame: 使用 LAME MP3 编码器。
      • -q:a 2: 设置 MP3 音频质量 (VBR),0 最高,9 最低。通常 2-4 是不错的选择。

6. 为视频添加/替换音频 (Adding/Replacing Audio)

给视频配上新的背景音乐或音轨。

添加新音轨,保留原视频 (如果原视频无声或想混合):

ffmpeg -i input_video.mp4 -i input_audio.mp3 -c:v copy -c:a aac -shortest output_video_with_audio.mp4
  • -c:v copy: 复制视频流,不重新编码视频。
  • -c:a aac: 将输入音频转码为 AAC (推荐)。
  • -shortest: 当视频和音频时长不同时,以最短的那个为准结束输出。

替换视频中的现有音轨:

ffmpeg -i input_video.mp4 -i new_audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 -shortest output_video_replaced_audio.mp4
  • -map 0:v:0: 从第一个输入文件 (input_video.mp4) 中选择视频流 (第一个视频流)。
  • -map 1:a:0: 从第二个输入文件 (new_audio.mp3) 中选择音频流 (第一个音频流)。

7. 压缩视频 (Compressing Video)

减小视频文件大小,通常通过降低比特率或使用更高效的编码参数。

通过设置目标比特率 (不推荐,质量不易控制):

ffmpeg -i input.mp4 -b:v 1M -b:a 128k output_compressed_bitrate.mp4
  • -b:v 1M: 设置视频目标比特率为 1 Mbps。
  • -b:a 128k: 设置音频目标比特率为 128 kbps。

通过 CRF (Constant Rate Factor) 控制质量 (推荐用于 H.264/H.265):

CRF 是一个质量参数,值越小,质量越高,文件越大。对于 libx264 (H.264),CRF 的范围通常是 0-51,默认 23。18-28 是常用范围。

ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a aac -b:a 128k output_compressed_crf.mp4
  • -c:v libx264: 使用 H.264 编码器。
  • -crf 28: 设置 CRF 值为 28 (质量会比默认的 23 低一些,文件更小)。
  • -preset medium: (可选) 编码速度和压缩率的平衡。可选值有 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslowmedium 是默认值。slowslower 会得到更好的压缩,但耗时更长。

8. 截取视频封面/缩略图 (Extracting Thumbnails)

从视频的特定时间点截取一帧作为图片。

ffmpeg -i input.mp4 -ss 00:00:05.500 -frames:v 1 output_thumbnail.jpg
  • -ss 00:00:05.500: 定位到视频的第 5.5 秒。
  • -frames:v 1-vframes 1: 只截取一帧视频。
  • output_thumbnail.jpg: 输出为 JPG 图片。也可以是 output_thumbnail.png 等。

9. 制作 GIF 动画 (Creating GIFs)

将视频片段转换为 GIF 动图。制作高质量 GIF 可能需要更复杂的滤镜。

基本 GIF 制作:

ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:03 -vf "fps=10,scale=480:-1:flags=lanczos" output.gif
  • -ss 00:00:10 -t 00:00:03: 从第 10 秒开始,截取 3 秒的片段。
  • -vf "fps=10,scale=480:-1:flags=lanczos":
    • fps=10: 设置 GIF 的帧率为 10 帧/秒 (可以根据需要调整)。
    • scale=480:-1: 将 GIF 宽度调整为 480 像素,高度按比例缩放。
    • flags=lanczos: 使用 lanczos 缩放算法,通常能得到较好的效果。

优化 GIF (生成调色板以提高质量):

这是一个两步过程:

  1. 生成调色板:ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:03 -vf "fps=10,scale=480:-1:flags=lanczos,palettegen" palette.png
  2. 使用调色板生成 GIF:ffmpeg -i input.mp4 -i palette.png -ss 00:00:10 -t 00:00:03 -filter_complex "[0:v]fps=10,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output_optimized.gif

10. 查看媒体文件信息 (Getting Media Info)

在进行任何操作前,了解视频的编码、分辨率、时长、比特率等详细信息非常重要。

ffmpeg -i input.mp4

这个命令不会进行任何转换,它会在终端打印出文件的元数据和流信息。添加 -hide_banner 可以隐藏 FFmpeg 的版本信息,使输出更简洁。

ffmpeg -i input.mp4 -hide_banner

一些通用参数和技巧:

  • -y: 自动覆盖输出文件,无需手动确认。
  • -hide_banner: 隐藏 FFmpeg 的版本和编译信息,使输出更简洁。
  • -loglevel error: 只显示错误信息,忽略普通信息和警告。
  • -c copy-codec copy: 表示直接复制流,不进行重新编码。这是最快的方式,但前提是目标容器格式支持源编码格式,且你不需要改变编码参数。
  • 查看支持的编解码器、格式等:
    • ffmpeg -codecs (查看所有可用的编码器和解码器)
    • ffmpeg -formats (查看支持的容器格式)
    • ffmpeg -filters (查看可用的音视频滤镜)

学习建议:

  1. 从简单命令开始:先熟悉格式转换、裁剪等基础操作。
  2. 查阅官方文档:FFmpeg 的官方文档 是最权威、最详尽的资源。
  3. 多加练习:通过实际操作来理解不同参数的效果。
  4. 利用社区资源:Stack Overflow、Super User 等社区有大量关于 FFmpeg 的讨论和解决方案。

这些命令应该能覆盖视频剪辑中的大部分常见需求。FFmpeg 的功能远不止于此,但掌握这些核心命令将极大提升你的工作效率。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据