首页 / 资讯中心 / 文章详情

Null Motion如何把视频自动切成3-8个段落?FFmpeg场景检测与分镜规划算法详解

Null Motion如何把视频自动切成3-8个段落?FFmpeg场景检测与分镜规划算法详解 ★ FEATURED ARTICLE
【免费下载链接】NullMotionPlay a finished motion-graphics ad in sync with the rough drafts it grew from, and export the breakdown as MP4.项目地址https://gitcode.com/gh_mirrors/nu/NullMotion点击查看免费下载NullMotion 是一个开源的动效广告拆解工具它把一支成品 motion-graphics 广告放在上方循环播放下方并排展示这支广告生长过程中产生的黑白 HyperFrames 草稿并能把整个拆解过程导出为 MP4。为了让上方成片和下方草稿逐帧对齐项目用 FFmpeg 场景检测把每支参考视频自动切成 3–8 个段落并记下每一处真实的镜头切换点。整个过程只跑一条脚本算法核心不超过 50 行非常适合作为视频自动分段的学习案例。一、整体思路先定数量再找切点最后对齐自动分段算法全部位于 scripts/plan-sections.mjs 中分为三步估算段落数量按片长算出大约每 4.5 秒一个段落结果被强制夹在 3–8 之间FFmpeg 场景检测扫一遍视频找出所有画面突变的真实镜头切换时间点分镜规划把均匀切分出的理想切点逐个吸附到附近真实的镜头切换处。最终结果写入两份 JSON段落边界sections.json和全部切换点cuts.json供前端页面做草稿同步播放。二、第一步用片长估算段落数量段落数量由一行代码决定见 scripts/plan-sections.mjsconst count Math.max(3, Math.min(8, Math.round(duration / 4.5)));含义很直白平均每 4.5 秒一段四舍五入后夹在 3 到 8 之间。仓库里自带的三支示例视频正好覆盖三种情况参考视频片长计算过程段落数Infinite · Global payments30.1s30.1 ÷ 4.5 ≈ 77SaaS · Launch sequence63.0s63 ÷ 4.5 ≈ 14 → 封顶8Motion study 082.8s2.8 ÷ 4.5 ≈ 1 → 保底34.5 秒是一个经验值动效广告里一个信息点通常持续 3–6 秒太短读不完太长节奏拖沓。3 段是下限保证最短的视频也至少有三格草稿可看8 段是上限避免草稿区挤成碎片。三、第二步FFmpeg 场景检测找出真实镜头切换均匀切分的问题是切点可能落在镜头中间。NullMotion 的做法是先用 FFmpeg 把所有真实切点找出来。核心命令见 scripts/plan-sections.mjsffmpeg -i 视频 -an -vf scale320:-2,selectgt(scene,0.18),showinfo -f null -关键参数逐个解释参数作用-an忽略音轨只做画面分析scale320:-2先缩放到 320 宽再分析速度更快检测精度不受影响selectgt(scene,0.18)只保留场景突变分数 0.18的帧0.18 就是灵敏度阈值showinfo把每个被选中帧的信息打印到 stderr其中包含时间戳pts_time-f null -结果不写盘只计算不编码scene是 FFmpeg 内置的场景检测分数本质上是相邻两帧的像素差异程度镜头内连续帧差异很小而一切镜cut差异会突然拉高。脚本随后用正则/pts_time:([\d.])/g从日志里把所有命中帧的时间戳抽出来得到一个按时间排序的切点数组。阈值 0.18 属于宁可漏检、不要误检0.3 左右会更严格只抓硬切调低则会把快速运镜、大字号闪现也算成切点。四、第三步分镜规划——把切点吸附到真实镜头有了切点数组后plan()函数见 scripts/plan-sections.mjs负责决定最终段落边界。算法对每一个理想切点即均匀分片位置duration * i / count做如下筛选最小间距候选切点必须比上一边界晚 1.2 秒以上防止两处切点挤在一起产生碎段尾段保护候选切点必须早于duration - 1.2避免最后一段只剩零点几秒容忍窗口候选切点与理想位置的偏差必须小于 45% 段长——离理想位置太远的切点宁可不采用就近吸附在全部合格候选里选离理想位置最近的一个如果一个都没有就直接使用理想位置退化为均匀切分。以 Infinite 这支 30 秒视频为例场景检测共命中 4 处切点[6.83, 7.77, 22.83, 23.77]而最终 7 段的边界是4.29 / 7.77 / 12.88 / 17.18 / 22.83 / 25.76。可以看到算法只吸到了 7.77 和 22.83 两个离理想位置足够近的切点6.83 和 23.77 因偏离理想位置太远被放弃——这正是第 3 条容忍窗口在起作用保证段落长度仍然接近均匀。完整数据可对照 showcase/references/sections.json 与 showcase/references/cuts.json。五、产出物sections.json、cuts.json 和接触表脚本运行结束后会写出三类结果sections.json每支视频对应一组{start, end}段落边界是前端分段的直接依据cuts.json所有被检测到的镜头切换时间保留下来用于草稿内部的节拍对齐见下文接触表contact sheet每段抽 2 帧分别取段落 30% 和 80% 处拼成一张2xN的缩略图存到.artifacts/sections/id.jpg供作者看着真实画面来写草稿见 scripts/plan-sections.mjs。这些段落数据最终如何被页面消费public/demo.mjs 启动时并行拉取sections.json和cuts.json按段落搭建草稿时间轴若某段草稿包含两个节拍two-beatbeatStarts()见 public/demo.mjs会在该段 30%–80% 区间内找出最靠近 55% 位置的真实切点让草稿恰好在成片切镜的那一刻换画面——这就是 README 里所说的Two-beat drafts switch at the exact moment the film cuts。如果页面拿不到规划数据也会用同样的duration / 4.5规则现场均匀切分保证功能不中断。六、自己跑一遍导入你的参考视频想在自己的视频上复现这套算法只需两条命令见 README.md 的 Bring your own references 一节python scripts/import-motionclone.py --source /path/to/MotionClone node scripts/plan-sections.mjs第一条负责导入要求系统装有 FFmpeg、ffprobe 和 Python 3导入逻辑见 scripts/import-motionclone.py第二条就是本文拆解的分段脚本。运行完成后打开本地页面即可看到自己的视频被切成 3–8 段、草稿逐帧同步的效果。七、小结NullMotion 的3–8 段自动分段可以浓缩为一句话用时长 ÷ 4.5定数量用 FFmpeg 的scene 0.18找真实切点再用最小间距 容忍窗口 就近吸附三条规则把理想切点对齐到真实镜头。整套算法简单透明、无第三方依赖却完整覆盖了自动分段工具里定量、检测、对齐三个关键环节是理解视频场景检测落地用法的优秀小样本。赞分享【免费下载链接】NullMotionPlay a finished motion-graphics ad in sync with the rough drafts it grew from, and export the breakdown as MP4.项目地址https://gitcode.com/gh_mirrors/nu/NullMotion点击查看免费下载相关推荐pyvideotrans视频镜头检测自动分割视频场景的终极指南pyvideotrans视频镜头检测自动分割视频场景的终极指南 pyvideotrans是一个功能强大的视频翻译和配音工具但你可能不知道它内置了智能视频镜头人工智能音视频语音AI 应用桌面应用一条命令把ASR模型转成MLX格式Confucius4-R2T2-bf16转换流程完整复现一条命令把ASR模型转成MLX格式Confucius4 R2T2 bf16转换流程完整复现 Confucius4 R2T2 bf16 是网易有道低延迟流式语音GhidrAssist社区检测原理Leiden算法如何自动把二进制函数划分成逻辑模块GhidrAssist社区检测原理Leiden算法如何自动把二进制函数划分成逻辑模块 面对一个几千个函数的二进制逆向工程师最头疼的就是从哪里下手。Ghi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站