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)scale
。1280
是宽度,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)
将多个视频文件拼接成一个。
方法一:如果所有视频的编码参数 (分辨率、帧率、格式等) 完全相同 (推荐此方法,速度快):
- 创建一个文本文件 (例如
mylist.txt
),列出所有要合并的文件:file 'clip1.mp4' file 'clip2.mp4' file 'clip3.mp4'
- 运行 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 是不错的选择。
- 如果想转换为 MP3:
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
,veryslow
。medium
是默认值。slow
或slower
会得到更好的压缩,但耗时更长。
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 (生成调色板以提高质量):
这是一个两步过程:
- 生成调色板:
ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:03 -vf "fps=10,scale=480:-1:flags=lanczos,palettegen" palette.png
- 使用调色板生成 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
(查看可用的音视频滤镜)
学习建议:
- 从简单命令开始:先熟悉格式转换、裁剪等基础操作。
- 查阅官方文档:FFmpeg 的官方文档 是最权威、最详尽的资源。
- 多加练习:通过实际操作来理解不同参数的效果。
- 利用社区资源:Stack Overflow、Super User 等社区有大量关于 FFmpeg 的讨论和解决方案。
这些命令应该能覆盖视频剪辑中的大部分常见需求。FFmpeg 的功能远不止于此,但掌握这些核心命令将极大提升你的工作效率。