1

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

优化选项对音频有什么作用?它是重新编码还是只是以不同的方式包装它?

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

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

这似乎只影响音轨,如果我禁用音频解码,视频在所有情况下都可以正常播放,至少到目前为止我所看到的 - 苹果工具、ffmpeg、商业编码器等。

4

1 回答 1

3

好的,所以经过一些实验,我想我已经找到了我的问题的答案。

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

通过 AAC 优化,两件事似乎发生了变化。

  1. 增加了包含 AAC 帧的有效载荷单元的大小,从而减少了有效载荷单元的总体数量。
  2. 有效载荷单元的大小是 TS 数据包中有效载荷空间的精确倍数,而不是适合整个 AAC 帧的数量。

这意味着几乎消除了填充 - 所有使用的空间都是有价值的数据,因此整体大小减小了。

此外,这意味着 AAC 帧不再与它们应该同步的视频帧直接相邻 - 实际上它们可能相距相当大的距离。

然而,这也意味着单个 Payload Unit 可能无法在末尾放置整个 AAC 帧,因此将尽可能多的帧放入此 Payload Unit,其余部分放在开头下一个 AAC 有效负载单元 - 这意味着 AAC 有效负载单元可能不会以 AAC 帧同步字节开始!(这就是我所看到的!)

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

于 2012-10-28T10:18:58.790 回答