使用FFMPEG单独转码HLS段

时间:2013-05-13 11:42:55

标签: ffmpeg http-live-streaming aac transcoding 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

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

End

文件的开头看起来有些可疑(虽然这可能不是问题):

Start

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

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

**更新1 **

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

Original Start Original End

**更新2 **

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

Side-by-side start Side-by-side end

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

**更新3 **

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

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

1 个答案:

答案 0 :(得分:0)

这更像是一个概念性答案,而不是包含使用的显式工具,对不起,但它在任何情况下都可能有用 - 它消除了引入音频工件的问题,但代价是在处理层中引入更多复杂性

我的建议是不要分割你的未压缩输入音频,而只是产生一个连续的压缩流,你输入音频代理,如icecast2服务器(或类似的,如果icecast不支持AAC),然后使用压缩音频块在代理的客户端进行拆分/重组。

那么,这里的方法是定期(例如,每隔60秒?)连接到代理并收集比你轮询的时间稍微大一点的音频(比如75秒值?) - 这需要设置为并行运行,因为在某些点上会运行两个客户端 - 如果需要,它甚至可以从cron运行,或者从shell脚本中运行...

一旦它工作,你将有一系列重叠的音频块 - 你需要做一些处理工作来比较这些并隔离中间的音频部分,这是每个块独有的。 ..

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

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