我正在将连续的实时流录制到高比特率 HLS 流中。然后我想将其异步转码为不同的格式/比特率。我主要有这个工作,除了音频伪影出现在每个片段之间(间隙和爆裂声)。
这是一个示例 ffmpeg 命令行:
ffmpeg -threads 1 -nostdin -loglevel verbose \
-nostdin -y -i input.ts -c:a libfdk_aac \
-ac 2 -b:a 64k -y -metadata -vn output.ts
检查示例声音文件显示音频末尾有一个间隙:
并且文件的开头看起来很可疑(尽管这可能不是问题):
我怀疑这些人工制品正在发生,因为转码是在没有整个流的上下文的情况下发生的。
关于如何说服 FFMPEG 产生适合 HLS 流的音频的任何想法?
** 更新 1 **
这是原始片段的开始/结束。如您所见,开始看起来仍然相同,但结束在 30 秒处干净利落地结束。我希望有损编码有一定程度的填充,但我有一些 HLS 设法进行无间隙播放的方法(这与带有自定义元数据的 iTunes 方法有关吗?)
** 更新 2 **
因此,我将原始文件(MPEG2 TS 中的 128k aac)和转码文件(aac/adts 容器中的 64k aac)都转换为 WAV 并将两者并排放置。这是结果:
我不确定这是否代表客户端将如何播放它,但解码转码后会在开始时引入间隙并使片段更长似乎有点奇怪。鉴于它们都是有损编码,我希望填充在两者中同样存在(如果有的话)。
** 更新 3 **
根据http://en.wikipedia.org/wiki/Gapless_playback - 只有少数编码器支持无缝 - 对于 MP3,我已经切换到 ffmpeg 中的 lame,到目前为止,问题似乎已经消失。
对于 AAC(参见http://en.wikipedia.org/wiki/FAAC),我尝试过 libfaac(与 libfdk_aac 相对),它似乎也能产生无缝音频。但是,后者的质量不是很好,我宁愿使用 libfdk_aac 是可能的。