ffmpeg 转换为 AAC 后音频文件错误

问题描述 投票:0回答:2

我在使用 FFmpeg 进行 acc 编码时遇到问题。 我有带有 aac 音频的 au mp4 文件。我尝试用 ffmpeg 复制音频。 在源 mp4 文件中,第一个音频噪声出现在 0.30 秒处。 使用

ffmpeg -i inputfile.mp4 -c:a copy outputfile.aac
转换后,生成的文件是错误的,第一个音频噪音出现在0.32秒处。 文件的持续时间也不一样。

当我强制编码器为 libfaac 时,它可以工作,但文件太大。

那么为什么使用默认编码器(aac、libfdk_aac)时它不起作用? 请注意,当我从 audacity 转换时,会出现同样的情况。

非常感谢

audio ffmpeg aac
2个回答
14
投票

音频流中有一个填充帧,解码器需要它来解码第一帧。这是 AAC 等 MDCT 音频编解码器的技术要求。在像 MP4/MKV 这样的定时样本容器中,第一帧具有负的呈现时间戳。在原始 AAC 比特流中,第一帧被简单地解码。每帧有 1024 个样本,因此持续时间为 21-23 毫秒。您的时间差异是由于该偏移造成的。重新包装到 M4A 等容器以避免这种情况。

背景,来自Apple

AAC 需要源 PCM 音频样本之外的数据,以便 由于音频样本的性质,正确地编码和解码音频样本 编码算法。 AAC 编码使用连续的变换 2048 个音频样本集,每 1024 个音频样本应用一次 (重叠)。为了解码正确的音频,两者都可以转换为任何 需要 1024 个音频样本周期。为此,编码器添加了 在第一个“真实”音频样本之前至少有 1024 个静音样本, 并且经常添加更多。这被称为不同的“启动”、“启动” 样本”,或“编码器延迟”。

缺乏编码器延迟和余数的明确表示 样本并不是 AAC 编码特有的问题。与 MPEG-4 和 ADTS/MPEG-2 比特流和文件容器,仍然没有 令人满意的、明确的编码器延迟表示或 剩余样品。 MP3 也存在这些数据依赖性和延迟 它的比特流,以及专有编解码器(例如 AC-3 等)。


0
投票

我最近发布了一个存储库,演示了如何无缝加入这些:https://github.com/wistia/seamless-aac-split-and-stitch-demo

您需要根据采样率进行一些数学运算来确定 AAC 帧边界在哪里。然后利用 ffmpeg 的 inpoint 和 outpoint 指令在连接文件时删除额外的填充。

如果您使用 m4a 重新包装,它在 Audacity 中看起来是正确的,但它仍然会在连接每个段之前在内部添加填充。

© www.soinside.com 2019 - 2024. All rights reserved.