转换为AAC后,FFmpeg播放错误的音频文件

9
我在使用FFmpeg处理编码时遇到了问题。我有一个带有AAC音频的mp4文件,尝试使用ffmpeg复制音频。在源mp4文件中,第一个音频噪声出现在0.30秒处。使用ffmpeg -i inputfile.mp4 -c:a copy outputfile.aac进行转换后,生成的文件是错误的,第一个音频噪声出现在0.32秒处。文件的持续时间也不同。
当我强制使用libfaac编码器时,它可以工作,但文件太大了。为什么默认编码器(aac、libfdk_aac)不能正常工作呢?请注意,在从Audacity进行转换时也会出现相同的问题。
非常感谢。

你能解决这个问题吗?我在使用FFMPEG将多个音频/视频文件拼接成一个视频时遇到了同样的问题,每当两个音频/剪辑连接在一起时,时间戳处会有大约一秒钟的静默。 - VnDevil
1个回答

13

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

背景信息,来自Apple

AAC编码需要超出源PCM音频样本的数据,以便正确地编码和解码音频样本,这是由于编码算法的性质所致。 AAC编码使用变换对连续的2048个音频样本进行处理,每1024个音频样本应用一次(重叠)。为了正确解码音频,需要任何1024个音频样本期间的两个变换。因此,编码器在第一个“真实”音频样本之前添加至少1024个静默样本,并经常添加更多。这被称为各种“引导”,“引导样本”或“编码器延迟”。
缺乏显式表示编码器延迟和剩余样本并不是AAC编码特有的问题。对于MPEG-4和ADTS / MPEG-2比特流和文件容器,仍然没有令人满意的显式表示编码器延迟或剩余样本。 MP3也具有这些数据依赖性和延迟在其比特流中,专有编解码器如AC-3等也是如此。

一些 mp3 编码器/解码器会存储/读取元数据信息以跳过 mp3 文件开头的静默样本 https://lame.sourceforge.io/tech-FAQ.txt - Aalex Gabi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接