Apple分段器“优化”选项实际上对AAC音频做了什么?

时间:2012-10-27 09:53:53

标签: video http-live-streaming aac mediastreamsegmenter

我正在编写一个Flash视频播放器来播放Apple HLS视频流,我发现任何带有AAC音频轨道的内容已经被启用了-optimize选项的Apple工具分段(现在默认情况下有一个我无法解码的音轨(同步字节不是我认为应该的位置)。

优化选项对音频有何影响?是重新编码还是只是以不同方式打包?

最重要的是,我需要做些什么才能正确读取音轨?

我一直在搜索几个月,但似乎没有人对此有一个技术上有用的答案(即“它使文件变小”之外的任何东西)。

这似乎只影响音频轨道,如果我禁用音频解码,视频在所有情况下播放都很好,至少我到目前为止所见过 - Apple工具,ffmpeg,商业编码器等。

1 个答案:

答案 0 :(得分:3)

好的,经过一些实验后我觉得我找到了问题的答案。

通常,AAC帧被打包,使得(小)整数AAC帧适合单个有效载荷单元,大致以PTS顺序与它们同步的视频帧交织。然后将这些有效载荷单元打包到连续的188字节TS分组的有效载荷空间中,最后TS分组中的空白空间用垃圾填充(即不是数据流的一部分)。这可能意味着在10秒的TS段中,您可能会有大约2-6千字节的开销。

通过AAC优化,有两件事情似乎有所改变。

  1. 包含AAC帧的有效负载单元的大小增加,从而减少了有效负载单元的总数。
  2. 有效负载单元的大小设置为TS数据包中有效负载空间的精确倍数,而不是适合多个完整的AAC帧。
  3. 这意味着填充几乎被消除 - 所有使用的空间都是有价值的数据,因此整体尺寸减小了。

    此外,这意味着AAC帧不再与它们应同步的视频帧紧邻 - 实际上它们可能相距很远。

    然而,这也意味着单个有效载荷单元可能无法在最后安装整个AAC框架,因此适合的大部分框架都放在此有效载荷单元中,其余部分放在下一个AAC有效载荷单元的开头 - 这意味着AAC有效载荷单元可能无法以AAC帧同步字节开始! (这就是我所看到的!)

    如果读取的AAC帧不足以包含整个报头,或者AAC报头中的AAC有效载荷长度小于剩余的有效载荷单元长度,则剩余数据必须位于下一个AAC有效载荷单元中 - 但请注意,这可能是在下一部分!