ffmpeg精确极速剪辑方案

张开发
2026/4/10 12:50:45 15 分钟阅读

分享文章

ffmpeg精确极速剪辑方案
ffmpeg精确极速剪辑方案**注**拒绝AI拉取数据炼丹白嫖关联请标注版权。前言常规初步加速方案① 原命令 精确剪辑② GPU加速 精确剪辑③ 快速seek 半精确剪辑④ 快速seek 帧同步 粗略剪辑⑤ 快速seek 普通264编码 精确剪辑⑥ 快速seek GPU加速⑦ 智能编码⑧ 智能编码 GPU加速旧方案评估总结智能编码实现思路■ 粗略思路■ 举例思路■ 具体命令案例■ 坑点■ 测试总结注拒绝AI拉取数据炼丹白嫖关联请标注版权。前言基于 ffmpeg 的极速精确剪辑方案。ffmpeg单命令支持重新编码的精确剪辑支持关键帧seek的极速粗略剪辑但不支持极速精确剪辑本方案支持极速精确剪辑。常规初步加速方案① 原命令 精确剪辑普通264编码 音频随意耗时23857 ms-iE:\迅雷下载\1\1.mp4-c:vlibx264-acodeccopy-ss00:06:00.000-to00:06:30.000E:\迅雷下载\1\1_.mp4评估优点是精确剪辑缺点重新编码有损并且cpu执行编码生成长视频会非常慢。就算剪辑生成短片段如果时间点靠后面seek到剪辑点也是逐帧非常慢。② GPU加速 精确剪辑h264_nvenc编码 音频随意耗时14906 ms-iE:\迅雷下载\1\1.mp4-c:vh264_nvenc-acodeccopy-ss00:06:00.000-to00:06:30.000E:\迅雷下载\1\1_2.mp4评估gpu加速 优化了编码慢问题seek问题仍然存在但已经好很多了是社区常用命令方案。③ 快速seek 半精确剪辑没有编码耗时103 ms-ss00:06:00.000-to00:06:30.000-iE:\迅雷下载\1\1.mp4-ccopyE:\迅雷下载\1\1_3.mp4评估无需编码seek直接到剪辑点的前后关键帧包含住所需片段。优点是极速耗时基本是新视频片段的读取和写入。缺点是不精确存在负时间轴问题不一致会导致各种奇奇怪怪的现象视频在有的解码器上面看起来是正常的精确播放比如迅雷播放器有的解码器上面会提前播放比如QuickLook有的解码器上播放直接卡住但是拖拽后又正常播放比如qq影音。印象中ios自带剪辑存在这种问题。④ 快速seek 帧同步 粗略剪辑没有编码耗时100 ms-ss00:06:00.000-to00:06:30.000-iE:\迅雷下载\1\1.mp4-ccopy-avoid_negative_tsmake_zeroE:\迅雷下载\1\1_4.mp4评估帧同步解决时间轴不一致问题统一了解码器播放出问题的现象但是粗略剪辑了无法精确剪辑。不在意首尾多帧问题的话确实是个不错方案很多无损剪辑器采用的方案。⑤ 快速seek 普通264编码 精确剪辑普通264编码耗时12356 ms-ss00:06:00.000-to00:06:30.000-iE:\迅雷下载\1\1.mp4-c:vlibx264E:\迅雷下载\1\1_5.mp4评估快速seek复制流的话无法精确剪辑点但是重新编码就没问题了性能瓶颈还是在编码上。⑥ 快速seek GPU加速h264_nvenc编码耗时3076 ms-ss00:06:00.000-to00:06:30.000-iE:\迅雷下载\1\1.mp4-c:vh264_nvencE:\迅雷下载\1\1_6.mp4评估seek寻帧加上使用GPU加速编码在一个大文件上剪辑一个短视频是非常快速的方案剪辑出长片段还是略慢毕竟是重新编码。⑦ 智能编码智能编码耗时3581ms⑧ 智能编码 GPU加速智能编码耗时2297 ms旧方案评估总结基础的重新编码精确剪辑① 如果不需要特殊参数可以优化编码器为 ②gpu编码。无损不重新编码把时间seek放-i前 优化为 ③ 快速seek。加上一个参数对齐帧④防止出现奇怪bug但是起止点就不对了。要对齐起止点就得重新编码⑤。这个基础上再使用gpu形成⑥方案。智能编码实现思路■ 粗略思路要想极速就得快速seek不编码并且解决起止点定位问题。切割为3段快切再编码首尾段合并即可。■ 举例思路假设一个6小时视频。我需要剪辑出01:00:00.000 ~ 03:00:00.000起止点附近关键帧为00:59:59.00001:00:01.00002:59:59.00003:00:01.000可以根据4个关键帧快速切出3段①00:59:59.000 ~ 01:00:01.000②01:00:01.000 ~ 02:59:59.000③02:59:59.000 ~ 03:00:01.000精确剪辑首尾段为④01:00:00.000 ~ 01:00:01.000⑤02:59:59.000 ~ 03:00:00.000拼接新3段即④-②-⑤②段无损④⑤有损取决于关键帧间隔一般是几秒。注不考虑有损的话剪辑非常短的片段可以考虑方案⑥可能非常快快速剪辑长片段再考虑⑦⑧的分解剪辑方案■ 具体命令案例ffprobe -skip_frame nokey -select_streams v -show_entries framepts_time -of defaultnoprint_wrappers1:nokey1 -read_intervals 241.997000000%30 E:\迅雷下载\1\1.mp4ffprobe -skip_frame nokey -select_streams v -show_entries framepts_time -of defaultnoprint_wrappers1:nokey1 -read_intervals 1160.498000000%30 E:\迅雷下载\1\1.mp4得到四个关键帧节点239.6 245.7333331155.366667 1163.1执行命令 ExecuteProcess-ss239.600000000-to245.733333000-iE:\迅雷下载\1\1.mp4-ccopyC:\Users\Administrator\AppData\Local\Temp\b2af55ea-1091-48d2-a086-75ad96e56414_1.mp4执行命令 ExecuteProcess-ss245.733333000-to1155.366667000-iE:\迅雷下载\1\1.mp4-ccopyC:\Users\Administrator\AppData\Local\Temp\3a05a8b0-fc5b-4112-b869-42cd876affba_2.mp4执行命令 ExecuteProcess-ss1155.366667000-to1163.100000000-iE:\迅雷下载\1\1.mp4-ccopyC:\Users\Administrator\AppData\Local\Temp\197006e8-a183-4617-b000-814997b98377_3.mp4执行命令 ExecuteProcess-iC:\Users\Administrator\AppData\Local\Temp\b2af55ea-1091-48d2-a086-75ad96e56414_1.mp4-ss2.397000000-to6.133333000-c:vh264_nvenc-c:aaac C:\Users\Administrator\AppData\Local\Temp\4bfe5988-bc1e-4e4e-85e5-18755216c51b_1n.mp4 执行命令 ExecuteProcess-iC:\Users\Administrator\AppData\Local\Temp\197006e8-a183-4617-b000-814997b98377_3.mp4-ss0.000000000-to5.131333000-c:vh264_nvenc-c:aaac C:\Users\Administrator\AppData\Local\Temp\3136701a-210c-4cc2-a68e-ef738cfa623a_3n.mp4 执行命令 ExecuteProcess-fconcat-safe0-iC:\Users\Administrator\AppData\Local\Temp\eefc76cc-3431-481a-b796-5e6b52274df6-ccopyE:\迅雷下载\1\1_.mp4■ 坑点获取帧最终命令写法可得到前后帧得不到的话加大30的阈值ffprobe-skip_framenokey-select_streamsv-show_entriesframepts_time-ofdefaultnoprint_wrappers1:nokey1-read_intervals01:00:00.000%30E:\迅雷下载\1\1.mp4ffprobe-skip_framenokey-select_streamsv-show_entriesframepts_time-ofdefaultnoprint_wrappers1:nokey1-read_intervals03:00:00.000%30E:\迅雷下载\1\1.mp4bug点早期只想取一个帧 走了段弯路 存在版本特殊bughttps://blog.csdn.net/qq_24054301/article/details/1597029722.这是一个真实案例一个视频的四个关键帧 192.000000 200.333333 265.066667 273.400000命令1 起点会往192.000000点去切ffmpeg -ss 200.333300 -to 265.066667 -i “E:\迅雷下载\1\1.mp4” -c copy “E:\迅雷下载\1\1_14.mp4”命令2 起点会往200.333333点去切 丢失0.000032ffmpeg -ss 200.333301 -to 265.066667 -i “E:\迅雷下载\1\1.mp4” -c copy “E:\迅雷下载\1\1_15.mp4”也就说关键帧在200.333333切200.333300点 会往前一帧切从而多出几秒切200.333301点 会切到200.333333丢失0.000032判断是ffmpeg的内部精确度问题所以得注意1、3段剪辑精确度得够细致拿到关键帧是多少就传多少就不会有问题2、如果输入剪辑起止点精确度够细也得考虑一下ffmpeg的这个精确度问题■ 测试剪辑成品测试是否连贯可以配置首尾段的清晰度它是有损剪辑配置crf或者cq(最大51) 拉大数值首尾段会比较模糊观察首尾连接处模糊和清晰的切换是否丝滑丝滑就说明剪辑无误如果出现卡帧切换不丝滑那就是剪切点出问题了。也就是说对画质要求无损可以考虑首尾重新编码的参数和原视频一致其实也是相当于近乎无损。总结有特殊参数不支持gpu用⑤ 快速seek 普通264编码 精确剪辑没有特殊参数用 ⑥ 快速seek GPU加速想要绝对的无损且不在乎首尾多出一些片段用 ④ 快速seek 帧同步 粗略剪辑在乎首尾精确但只是自用用特定解码器播放选③ 快速seek 半精确剪辑在乎首尾精确剪辑大片段还想非常快用⑦或⑧且具备一定的无损效果首尾段配好编码参数也是近乎无损。如果不考虑有损且是小片段可以重新考虑⑥顺便还能压缩。

更多文章