我正在写一个flash视频播放器来播放Apple HLS视频流,并且我发现使用AAC音频的任何内容都用Apple工具进行了 -optimize
选项的苹果工具进行了分割启用(现在默认值)具有我无法解码的音轨(同步字节不是我认为应该是的)。
优化选项对音频有什么作用?它是对其进行重新编码还是只是将其包装不同?
最重要的是,我需要做什么才能正确阅读音轨?
我已经搜索了几个月,但是似乎没有人对此有一个有用的答案(即"它使文件较小"以外的任何东西)。
这似乎只会影响音轨,如果我禁用音频解码,则视频在所有情况下都很好,至少到目前为止,我所看到的一切 - 苹果工具,FFMPEG,商业编码器等。
好吧,所以经过一些实验,我认为我已经找到了我的问题的答案。
通常,AAC框架被包装,使得(小)全数AAC框架适合单个有效负载单元,以PTS顺序大致交织在一起,并与他们同步的视频帧相交。然后将这些有效负载单元包装到连续188个字节TS数据包的有效负载空间中,最后一个带有垃圾的TS数据包中的空白空间(即不是数据流的一部分)。这可能意味着在10秒的ts段中,您可能以大约2-6 kbytes的顺序有一个开销。
随着AAC优化,似乎有两件事发生了变化。
- 增加包含AAC帧的有效载荷单元的大小增加了,总体减少了有效载荷单元的数量。
- 有效载荷单元的尺寸为TS数据包中的有效载荷空间的确切倍数,而不是适合整个AAC框架。
这意味着几乎消除了填充物 - 所有使用的空间都是有价值的数据,因此整体尺寸降低。
此外,这意味着AAC框架不再与他们应该同步的视频框架紧密相邻 - 实际上它们可能相距甚远。
但是,这也意味着单个有效载荷单元可能无法在结尾处拟合整个AAC框架,因此将框架放在此有效载荷单元中,其余的框架放在下一个AAC有效负载单元的开头 - 这意味着AAC有效载荷单元可能不会以AAC框架同步字节开始!(这是我所看到的!)
读取AAC框架不足以包含整个标头或AAC标头中的AAC有效载荷长度小于剩余有效负载单位长度的情况,其余数据必须位于下一个AAC有效负载单元 - 但是请注意,这可能在下一个部分!