shouldOptimizeForNetworkUse实际上是做什么的?

28
苹果文档中,它仅仅说了这样一句话:

 

当此属性的值为YES时,输出文件将以这样的方式编写,即只需下载文件的一小部分即可开始播放。

但实际上发生了什么?

1个回答

79
当将 shouldOptimizeForNetworkUse 设置为 YES 时,调用 finishWriting 将会把 MP4 的 moov atom(电影原子)从文件末尾移动到文件开头。moov atom 包含有关电影文件的信息,如时间刻度和持续时间。moov 还包含“子原子”,其中包含如轨道、文件中的数据偏移量等信息。
仅当 moov atom 位于文件的开头位置而不是文件的结尾位置时,才可以使用其中的信息进行播放。这样一来,即使只加载了文件的开头部分,电影播放器也可以开始播放文件。
在实践中,现代浏览器将使用 HTTP/1.1 Range 标头从文件的末尾提取 moov atom 以加载 moov atom。
将 shouldOptimizeForNetworkUse 设置为 YES 还具有一些副作用:
- 完成电影需要更长的时间,因为除了 atom 的偏移量之外,还必须修改整个文件。 - 输出文件被锁定并且不可访问,因为 finishWriting 需要修改整个文件(移动和更新 atoms)。当设置为 NO 时,movieFragmentInterval 设置输出视频文件的刷新间隔,使得写入时文件可读取,因为片段以它们的最终形式刷新到文件中。finishWriting 只需要将 moov atom 追加到文件末尾,而不是触及已经写入的片段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接