答案1
当 ffmpeg 加载 AAC 流时,它会在内部添加额外的 2 个静音帧作为填充,通常称为“启动样本”。上面的注释说,对于特定的采样率,添加 0.2322 的入点是正确的,但如果您希望它完美无缝,还有很多事情要做。
为了无缝连接且没有间隙,您可以执行以下操作:
- 根据采样率计算 AAC 帧长度,例如 44.1KHz 的 1024/44100 = 0.02321995。
- 在每个片段的开始和结束处编码额外的 2 个 AAC 帧。
- 考虑 ffmpeg 内部始终添加的 2 个静默填充帧。
- 在 concat txt 文件中分配 inpoint 和 outpoint 指令,以便在创建输出文件时仅使用“好”的内容。
需要 2 个额外的开始帧,因为每个 AAC 帧都依赖于它之前的最多 2 个帧。因此,要正确编码第一帧,它需要该上下文。需要末尾的 2 个额外帧,因为 ffmpeg 会在末尾逐渐减小音频以避免突然出现爆音。通过添加 2 个额外帧,我们可以改变逐渐减小的幅度,这样它就不会影响我们的实际内容。然后使用入点和出点删除这些额外的帧,以避免重复内容。
使用此方法时,所有片段的长度必须为 AAC 帧持续时间的整数倍。如果不是,您将在片段边界看到不可预测的伪影。
我最近发布了一个 repo,通过实际代码进一步证明了这一点:https://github.com/wistia/seamless-aac-split-and-stitch-demo。