节拍同步
scripts/ 中的脚本:
beats.py MUSIC --out beats.json [--start S --end E]— 速度、节拍、强拍猜测、强起音(重拍)、每秒 RMS 能量。timemap.py— 构建可变速度时间映射(速度斜坡)并使用 ffmpeg 逐帧渲染。
1. 分析音乐
python beats.py song.mp3 --out edit/beats.json
输出 tempo、beats(秒)、downbeats(从最强相位开始的每第 4 个节拍)、hits(强起音:军鼓/底鼓/重拍)、每 0.5 秒的 energy。
解读结果:
- 节拍周期
P = 60 / BPM。在 30 fps 下,120 BPM 的一个节拍 = 15 帧。 - 重拍不总是节拍。 人声重音、逐渐上升的结尾、重拍。对于“编辑音频”趋势,剪切点是重拍,而不是节拍器。
- librosa 可能锁定到半速或双倍速。合理性检查:典型流行音乐 90-130 BPM,trap 130-160(通常感觉为半速),EDM 120-128,phonk 130-150。如果在帧抓取测试中检测到的网格感觉不对,则减半/加倍。
- 能量曲线找到重拍/副歌:安静部分之后的最大 RMS 跳跃。
2. 选择歌曲窗口
- 短视频:7-20 秒。在 强拍 上开始窗口,并在强拍或乐句结尾(4 或 8 小节)结束。
- 将最强的视觉放在重拍上。如果重拍在歌曲的 12 秒处,而您想要它在卷轴的 3 秒处,则窗口从 9 秒开始。
- Instagram/TikTok 上的热门声音:应用内声音从固定点开始。如果最终帖子会使用应用内声音,则将编辑对齐到该起始点,并导出带有参考音频的版本作为指南。
- 淡入音乐 10-50 毫秒(避免咔嗒声),除非窗口从瞬态开始;淡出 0.3-1.5 秒,或在硬重拍上结束。
3. 构建网格并放置事件
fps = 30
fr = lambda t: round(t * fps) # 将每个事件捕捉到最近帧
U = beat_period / 2 # 子节拍单位(八分音符),如果歌曲很密集
- 剪切:在节拍上以获得流畅感,在重拍上以获得冲击力。每个节拍都剪切会令人疲惫;每 2 或 4 个节拍剪切一次,仅在重拍前(2-4 秒)的爆发中使用每个节拍剪切。
- 预期:在节拍 前 1-2 帧放置剪切在手机上感觉更紧凑(音频延迟 + 感知)。测试两者并一致选择。
- 闪光/抖动/缩放冲击:在重拍上,2-6 帧,衰减。
- 文字:单词出现在人声音节或节拍上;每个单词至少保持 0.4 秒用于单个单词,对于按节奏朗读的行约 0.25 秒/单词。
- 速度/效果变化:在强拍或重拍上。
- 将每个事件及其音乐原因保存在表格(
timing.json)中;构建脚本读取它。
4. 速度斜坡(速度)
速度斜坡是一个时间映射 src_t = f(out_t)。通过具有缓动速度的片段构建:
# 速度曲线:1x ... 在重拍之间斜坡到 4x ... 在重拍上回到 0.3x
segments = [(out_start, out_end, speed_start, speed_end, ease)]
- 使用 smoothstep/cubic 缓动输入和输出速度;瞬间从 1x 跳到 4x 看起来像故障。
- 在 重拍上慢速(0.2-0.5x),在 重拍之间快速(2-5x)。重拍帧本身显示关键动作(撞击、转身、看)。
- 慢速部分需要高帧率源或帧插值(
minterpolate、Resolve Speed Warp、RIFE)。 - 在快速部分添加运动模糊(
tmix=frames=3或在时间映射渲染器中帧混合)以避免频闪。 - 真实案例:俯拍桌面镜头,相机移动部分保持 1x,静态部分为 5.6x,每次速度变化都在强重拍上;光流传递(OpenCV LK + RANSAC 相似性)自动定位相机移动(见
motion-tracking)。
timemap.py 通过为每个输出帧拉取正确的源帧(可选帧混合)来渲染时间映射——比链式使用 setpts 滤镜更精确且更简单。
5. 匹配参考卷的时机
- 下载/获取参考;提取其音频。
- 检测其剪切:
ffmpeg -i ref.mp4 -vf "select='gt(scene,0.3)',showinfo" -f null - 2>&1 | grep pts_time。 - 检测其音频的节拍;将每个剪切表示为节拍索引或偏移 → 这就是节奏模板。
- 通过逐帧步进(1/30 秒精度)测量文字开启/关闭时间。
- 在相同网格上用您的素材重新构建(见
reference-matching)。
6. 验证
- 场景检测渲染;每个剪切时间 × fps 应等于计划帧(±0)。
- 在调试渲染中在节拍上叠加点击音轨(
aevalsrc正弦脉冲)并在重拍处抓取帧。 - 您无法监听:报告数字(计划 vs 测量的剪切帧),并要求用户用耳朵检查。