使用FFMPEG单独转码HLS段

ray*_*ayh 8 ffmpeg aac transcoding http-live-streaming mpeg2-ts

我正在向高比特率的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
Run Code Online (Sandbox Code Playgroud)

检查示例声音文件显示音频末尾有间隙:

结束

并且文件的开头看起来可疑地减弱了(尽管这可能不是问题):

开始

我怀疑这些人工制品正在发生,因为转码是在没有整个流的背景下发生的.

关于如何说服FFMPEG产生适合HLS流的音频的任何想法?

**更新1**

以下是原始细分的开始/结束.正如你所看到的,开始时看起来仍然相同,但最终在30s结束时干净利落.我期望有一定程度的填充与有损编码,但我有一些方法,HLS设法做无间隙播放(这与iTunes方法与自定义元数据有关吗?)

原始开始 原始结束

**更新2**

因此,我将原始(128k aac in MPEG2 TS)和转码(64k aac in aac/adts容器)转换为WAV并将两者并排放置.这是结果:

并排开始 并排结束

我不确定这是否代表了客户端如何播放它,但解码转码后的解码器在开始时引入了一个间隙并使段更长时间似乎有点奇怪.鉴于它们都是有损编码,我希望填充在两者中同样存在(如果有的话).

**更新3**

根据http://en.wikipedia.org/wiki/Gapless_playback-只有少数编码器支持无间隙 - 对于MP3,我在ffmpeg中已经变得蹩脚,到目前为止,这个问题似乎已经消失了.

对于AAC(请参阅http://en.wikipedia.org/wiki/FAAC),我尝试了libfaac(而不是libfdk_aac),它似乎也产生了无间隙音频.然而,后者的质量并不是那么好,我宁愿使用libfdk_aac也是可能的.

小智 0

这更多的是一个概念性的答案,而不是包含要使用的明确工具,抱歉,但它在任何情况下都可能有用 - 它消除了引入音频伪影的问题,但代价是在处理层中引入了更多的复杂性。

我的建议是根本不分割未压缩的输入音频,而只生成一个连续的压缩流,将其传输到音频代理,例如icecast2服务器(或类似的服务器,如果icecast不支持AAC),然后进行分割/recombine 在代理的客户端使用压缩音频块。

因此,这里的方法是定期(例如,每 60 秒?)连接到代理并收集比您轮询的时间段稍大一点的音频块(例如,75 秒?) - 这需要设置最多可以并行运行,因为在某些时候会有两个客户端在运行 - 如果需要的话甚至可以从 cron 运行,或者从 shell 脚本后台运行...

一旦工作正常,您将拥有一系列稍微重叠的音频块 - 然后您需要做一些处理工作来比较这些音频并隔离中间的音频部分,这对于每个块都是唯一的......

显然这是一种简化,但假设代理不添加任何元数据信息(即 ICY 数据或提示),那么以这种方式分割音频应该允许处理后的块连接起来,而不会产生任何音频伪影,因为只有一组原始音频输入的输出并比较它们将是一件轻而易举的事,因为您实际上并不关心格式,此时它只是字节。

这样做的好处是,您已经断开了音频编码器与客户端的连接,因此,如果您想并行运行其他一些进程来转码为不同的格式或比特率,或者为其他消费者更积极地对流进行分块,那么这并不需要。更改代理编码器端的任何内容 - 您只需使用与上述类似的工具链将另一个客户端添加到代理即可。