我正在编写一个Flash视频播放器来播放Apple HLS视频流,我发现任何带有AAC音频轨道的内容已经被启用了-optimize
选项的Apple工具分段(现在默认情况下有一个我无法解码的音轨(同步字节不是我认为应该的位置)。
优化选项对音频有何影响?是重新编码还是只是以不同方式打包?
最重要的是,我需要做些什么才能正确读取音轨?
我一直在搜索几个月,但似乎没有人对此有一个技术上有用的答案(即“它使文件变小”之外的任何东西)。
这似乎只影响音频轨道,如果我禁用音频解码,视频在所有情况下播放都很好,至少我到目前为止所见过 - Apple工具,ffmpeg,商业编码器等。
答案 0 :(得分:3)
好的,经过一些实验后我觉得我找到了问题的答案。
通常,AAC帧被打包,使得(小)整数AAC帧适合单个有效载荷单元,大致以PTS顺序与它们同步的视频帧交织。然后将这些有效载荷单元打包到连续的188字节TS分组的有效载荷空间中,最后TS分组中的空白空间用垃圾填充(即不是数据流的一部分)。这可能意味着在10秒的TS段中,您可能会有大约2-6千字节的开销。
通过AAC优化,有两件事情似乎有所改变。
这意味着填充几乎被消除 - 所有使用的空间都是有价值的数据,因此整体尺寸减小了。
此外,这意味着AAC帧不再与它们应同步的视频帧紧邻 - 实际上它们可能相距很远。
然而,这也意味着单个有效载荷单元可能无法在最后安装整个AAC框架,因此适合的大部分框架都放在此有效载荷单元中,其余部分放在下一个AAC有效载荷单元的开头 - 这意味着AAC有效载荷单元可能无法以AAC帧同步字节开始! (这就是我所看到的!)
如果读取的AAC帧不足以包含整个报头,或者AAC报头中的AAC有效载荷长度小于剩余的有效载荷单元长度,则剩余数据必须位于下一个AAC有效载荷单元中 - 但请注意,这可能是在下一部分!