下载地址:https://www.gyan.dev/ffmpeg/builds/#release-builds

(注意,在我的系统中,如果设置了conda环境变量,则在路径C:\Users\用户\.conda\envs\comfyui_cp311\Library\bin下有较旧版本的ffmped)

1、查看视频信息

✅ 方法:查看所有视频流详细信息

ffmpeg -i "video.mp4"

输出中包含:

Stream #0:1: Video: h264 ..., 1920x1080, 25 fps, ...

这里 25 fps 就是帧率。


🔎输出提取的关键信息:

Duration: 00:02:02.83, start: 0.000000, bitrate: 1285 kb/s
Stream #0:0: Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, fltp, 48 kb/s
Stream #0:1: Video: wmv2 (WMV2 / 0x32564D57), yuv420p, 640x340, 1360 kb/s, SAR 1:1 DAR 32:17, 24 tbr, 1k tbn At least one output file must be specified
 

🔎 从你的输出提取的关键信息:

Video: wmv2 ..., 640x340, 1360 kb/s, SAR 1:1 DAR 32:17, 24 tbr, 1k tbn
  • 24 tbr 表示 帧率 ≈ 24 FPS

  • tbrTime Base Rate,通常是帧率的代表值

  • tbn:时间戳基准(一般对处理没影响)

2、编码格式

🔝 主流视频编码格式对比

编码格式通用名称质量/压缩比解码兼容性编码速度推荐场景
H.264 AVC (Advanced Video Coding) ★★★★☆(高) ★★★★★(非常高) ★★★(适中) YouTube、直播、网页、电视、手机
H.265 HEVC (High Efficiency Video Coding) ★★★★★(极高) ★★★★(中等) ★★(慢) 4K/8K 视频、高压缩率存档
AV1 AOMedia Video 1 ★★★★★(极高) ★★(较低) ★(非常慢) Web 视频压缩、节省流量/空间
VP9 Google VP9 ★★★★☆(高) ★★★★(较高) ★★☆(偏慢) YouTube、WebM 格式
ProRes Apple ProRes ★★★(中等) ★★★(专业) ★★★★(快) 视频剪辑、非压缩交付、Apple 设备
AVC-Intra H.264 变体 ★★★★(高) ★★☆(专业) ★★★(中等) 广电、电视台采编
MJPEG Motion JPEG ★(低) ★★★★(广泛) ★★★★(快) 摄像头录像、快速预览

⚠️ 兼容性提醒:

编码格式播放兼容性情况
H.264 ✅ 全平台、手机、电视通吃
H.265 ⚠️ 老旧设备/浏览器不支持
AV1 ⚠️ 只有新版浏览器和硬件支持
VP9 ✅ 浏览器广泛支持,但移动端一般
ProRes ⚠️ 仅限专业工具播放/剪辑

✅ crf 值

  • CRF(Constant Rate Factor)是一个 控制视频画质与体积之间的权衡参数

  • 范围:0(无损)到 51(最差)

  • 推荐值说明

CRF 值意义画质评价推荐用途
0 真无损(lossless) 文件巨大 极端存档,仅用于后期
15~18 极高画质 视觉无损 高质量保留/发布
19~23 高画质 普通高清 YouTube、日常压缩
24~28 中等画质 明显可见压缩 网速慢或空间不足场景
29+ 低画质 像素化严重 不推荐

所以,CRF=18 大约等价于「99 画质」。如果你想更保守,CRF=16 也可以。

 🎯 FFmpeg 默认 -crf 值一览:

编码器默认 CRF 值说明
libx264 23 中等画质,压缩与质量的平衡点
libx265 28 H.265 默认值更高(压缩效率更强)
libvpx 32 VP8,质量稍低
libvpx-vp9 32 VP9,压缩比高,但默认质量一般
libaom-av1 32 AV1,高压缩比,默认值偏高(较低质量)

 3、分离音频、分离视频帧

✅ 分离音频:使用 MP3 编码器将音频重新编码

推荐命令:

ffmpeg -i "D:\AI\input\ZXY\2008.2.7.wmv" -vn -acodec libmp3lame -q:a 2 "2008.2.7.mp3"

参数解释:

  • -vn:忽略视频流

  • -acodec libmp3lame:使用 LAME MP3 编码器

  • -q:a 2:音质设置(2 是高音质,范围 0~9,越小越好)

  • 输出文件:2008.2.7.mp3

这个命令会自动将 wmav2 转为标准 MP3 文件,适用于各种音频处理场景。

✅ 基础命令:提取所有帧

ffmpeg -i input.mp4 -q:v 1 frame_%05d.jpg

📌 参数说明:

参数含义
-i input.mp4 输入视频
-q:v 1 图像质量(1 是 JPEG 的最高质量,31 是最低)
frame_%05d.jpg 输出帧的文件名格式,%05d 是帧编号(如 frame_00001.jpg

✅ 提取第一帧的命令:

ffmpeg -i input.mp4 -vframes 1  frame_%05d.png

参数解释:

  • -vframes 1:只输出 1 帧(即第一帧)

✅ 输出为 PNG(无损)

ffmpeg -i input.mp4 frame_%05d.png

PNG 格式无损压缩,适合后期处理(如 AI 生成、视频恢复等),但文件大。


⏱ 每秒提取 N 帧(而非每一帧)

ffmpeg -i input.mp4 -vf fps=5 frame_%04d.jpg

每秒只保存 5 帧,用于抽帧预览或节省空间。


🧭 指定时间段提取帧

ffmpeg -ss 00:00:10 -to 00:00:20 -i input.mp4 -q:v 2 frame_%04d.jpg

只提取第 10 秒到第 20 秒之间的帧。


🎞 提取关键帧(I帧)

ffmpeg -skip_frame nokey -i input.mp4 -vsync vfr -q:v 2 keyframe_%03d.jpg

只导出关键帧,适合做镜头预览或视频摘要。


📂 输出到文件夹(推荐)

mkdir -p frames ffmpeg -i input.mp4 -q:v 1 frames/frame_%05d.jpg

防止和当前目录混乱。

4、图片+音频 合成视频

✅ 图片合成视频:

ffmpeg -framerate 24 -i D:\AI\ComfyUI\input\Upscale\Video_%04d_.png \ -i ./2008.2.7.mp3 \ -c:v libx264 -crf 18 -pix_fmt yuv420p \ -c:a aac -shortest output.mp4
  • -framerate 24:设定每秒帧数为 24 FPS(要与图片实际帧率匹配)

  • -i D:\...Video_%04d_.png:加载按顺序命名的帧图,%04d 对应 00010002...

  • -i ./2008.2.7.mp3:加载音频

  • -c:v libx264:视频编码使用 H.264

  • -crf 18:视觉无损(范围 0~51,越低越清晰)
  • -pix_fmt yuv420p:像素格式设置为兼容性最好的 YUV420

  • -c:a aac:音频编码为 AAC

  • -shortest:以“音频或视频中较短的那个”为最终时长(避免黑屏或静音)

  • output.mp4:输出文件名

 


 如果你的图像文件是从 Video_00301_.png 开始,并按顺序编号(例如 Video_00302_.png, Video_00303_.png…),那么 FFmpeg 默认从 Video_00001.png 起始编号匹配不到这些文件,需要使用 -start_number 参数来指定起始帧号。


✅ 正确命令如下:

ffmpeg -framerate 24 -start_number 301 -i "D:\AI\ComfyUI\input\Upscale\Video_%05d_.png" -i "2008.2.7.mp3" -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4

🔍 参数说明:

  • -start_number 301:告诉 FFmpeg 从 00301 开始找图像

 


 如果图片编号不连续(例如:Video_00301_.pngVideo_00303_.pngVideo_00309_.png……),那么 FFmpeg 的 %d 模式 无法处理不连续帧,因为它要求连续编号。此时有两个解决方案:


✅ 方法一:用文件列表(推荐方式)

你可以创建一个包含所有图片路径的文本文件(例如 frame_list.txt),然后用 FFmpeg 的 -f concat -safe 0 -i 模式导入。

步骤如下:

  1. 生成列表文件(注意格式必须是这样):

file 'D:/AI/ComfyUI/input/Upscale/Video_00301_.png'
file 'D:/AI/ComfyUI/input/Upscale/Video_00303_.png'
file 'D:/AI/ComfyUI/input/Upscale/Video_00309_.png' ...

你可以用批处理或 Python 自动生成,或手动编辑。

  1. 使用 FFmpeg 合成视频

ffmpeg -f concat -safe 0 -r 24 -i frame_list.txt -i "2008.2.7.mp3" -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4

✅ 方法二:使用 -pattern_type glob(前提是文件名规则一致)

如果所有图片在同一文件夹内,你可以使用通配符匹配所有文件:

ffmpeg -framerate 24 -pattern_type glob -i "D:/AI/ComfyUI/input/Upscale/Video_*.png" -i "2008.2.7.mp3" -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4
 

⚠️ 注意:这种方法不会按照编号排序,而是按文件名字典序排序,可能会造成帧顺序错乱!
如果你不确定帧顺序正确,还是建议用 方法一(列表)

在windows下用不了,会报错误:Pattern type 'glob' was selected but globbing is not supported by this libavformat build

 4、图片+音频 合成视频(指定分辨率)

1、指定视频长宽,当图片一边比指定尺寸小时,以黑边填补,当图片另外一边比指定尺寸大时,压缩到指定尺寸

ffmpeg -framerate 25 -i Video_%05d_.png -i ./纯.mp3 -vf "scale='if(gt(a,3840/2160),3840,-1)':'if(gt(a,3840/2160),-1,2160)',pad=3840:2160:(3840-iw)/2:(2160-ih)/2:black" -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4

2、指定视频长宽,当图片一边比指定尺寸小时,以黑边填补

ffmpeg -r 25 -i Video_%05d_.png -i ./纯.mp3 -vf "scale=w=iw:h=ih:force_original_aspect_ratio=decrease,pad=3840:2160:(ow-iw)/2:(oh-ih)/2:black" -s 3840x2160 -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4

3、指定视频长宽,当图片尺寸与指定长宽不一致时,使用Lanczos算法缩放图片到指定长宽

ffmpeg -framerate 25 -i Video_%05d_.png -i ./纯.mp3 -vf "scale=3840:2160:flags=lanczos"  -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4

🔍 参数说明:

  • -vf "scale=3840:2160:flags=lanczos":使用 Lanczos 算法将图片缩放到指定尺寸

 5、将多个视频合成一个

你可以使用 ffmpeg 命令行 合并多个视频(如 MP4 文件),但要确保视频的 编码格式、分辨率、帧率等一致。以下是几种常见场景下的 命令行-only 合并方法


✅ 方法 1:使用 concat demuxer(推荐,快速无重编码)

适用于:视频编码、分辨率、帧率完全一致

步骤:

  1. 创建一个文本文件 list.txt,内容格式如下:

file 'video1.mp4' file 'video2.mp4' file 'video3.mp4'

⚠️ 文件路径支持相对或绝对路径,最好不要有空格,确保格式正确。

  1. 执行合并命令:

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
  • -c copy 表示直接拷贝视频流,无需重新编码,速度非常快。

  • -safe 0 允许使用绝对路径或含特殊字符的路径。


✅ 方法 2:使用 concat 滤镜(当视频参数不一致)

适用于:不同编码或参数的视频(必须重编码)。

ffmpeg -i video1.mp4 -i video2.mp4 -i video3.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.mp4

解释:

  • concat=n=3:v=1:a=1 表示合并 3 个视频,含视频轨和音频轨。

  • 所有视频的 分辨率、帧率、通道数等必须一致,否则会报错。

  • ffmpeg 会自动重编码。


✅ 方法 3:配合 Bash 一行命令(自动生成列表并合并)

(for f in *.mp4; do echo "file '$f'"; done) > list.txt && \ ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

说明:

  • 自动将当前目录下的所有 .mp4 文件添加到 list.txt

  • 然后执行快速无重编码的合并


⚠️ 注意事项

条件concat demuxerconcat filter
是否需要重新编码 否(更快) 是(更兼容)
视频格式是否必须一致
音视频轨道数必须相同
音频丢失会报错

🎁 附加技巧:转码对齐后再合并(必要时)

ffmpeg -i input.mp4 -vf "scale=1920:1080,fps=30" -c:v libx264 -preset fast -crf 23 fixed_input.mp4

用它预处理所有视频,使其可用于 concat 合并。

  6、分割视频

方法 1: 按时间段分割(最常用)

使用 -ss(起始时间)和 -t(持续时间)参数来切割视频片段。时间格式为 HH:MM:SS 或秒数(如 60 表示 1 分钟)。

命令示例:从视频开头切割前 10 分钟的片段。

text
 ffmpeg -i input.mp4 -ss 00:00:00 -t 00:10:00 -c copy output1.mp4
  • -i input.mp4:输入文件。
  • -ss 00:00:00:从第 0 秒开始(可改为如 -ss 00:05:30 从 5 分 30 秒开始)。
  • -t 00:10:00:切割 10 分钟(可改为秒数 -t 600)。
  • -c copy:直接复制视频/音频流,不重新编码(推荐用于无损切割)。
  • output1.mp4:输出文件(可自定义名称和格式)。

方法 2: 按文件大小或帧数分割

  • 按大小分割(例如,每 100MB 一个文件):
    text
     ffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_time 00:05:00 -reset_timestamps 1 output_%03d.mp4
    • -f segment:使用分段输出格式。
    • -segment_time 00:05:00:每个片段 5 分钟(可调整为大小阈值,但 FFmpeg 更精确用时间)。
    • output_%03d.mp4:输出文件名为 output_001.mp4、output_002.mp4 等。
  • 按帧数分割(例如,每 1000 帧一个片段):
    text
    ffmpeg -i input.mp4 -vf fps=30 -frames:v 1000 output1.mp4
    (这里假设视频 30 FPS,1000 帧 ≈ 33 秒。)

方法 3: 使用列表文件批量分割(高级)

如果有多个切割点,可以创建一个文本文件 segments.txt,内容如下(每行一个片段,格式:file 'input.mp4'\noutpoint 00:10:00):

text
file 'input.mp4'
outpoint 00:10:00
file 'input.mp4'
outpoint 00:20:00

然后运行:

text
ffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4

但这更适合合并;对于分割,推荐方法 1。

 

posted on 2025-05-27 23:18  zs李四  阅读(217)  评论(0)    收藏  举报