27

Apple文档中它只是说:

当此属性的值为 YES 时,将写入输出文件,即只需下载少量文件即可开始播放。

但实际发生了什么?

4

1 回答 1

75

当 shouldOptimizeForNetworkUse 设置为 YES 时,调用 finishWriting 会将 MP4 moov atom(电影原子)从文件末尾移动到文件开头。moov atom 包含有关电影文件的信息,例如时间刻度和持续时间。moov 还包含“子原子”,其中包含轨道、文件中的数据偏移等信息。

只能使用 moov atom 中的信息进行播放,并且当它位于文件的开头而不是文件的末尾时,电影播放器​​可以开始播放文件,即使它只加载了文件的开头。

在实践中,现代浏览器将使用 HTTP/1.1 Range 标头从文件末尾获取 moov atom 以加载 moov atom,即使它位于文件末尾。

将 shouldOptimizeForNetworkUse 设置为 YES 也有一些副作用:

  • 完成电影需要更长的时间,因为必须修改文件以及原子中的偏移量。
  • 输出文件被锁定且不可访问,因为完成写入需要修改整个文件(移动和更新原子)。当设置为 NO 时,movieFragmentInterval 设置写入输出视频文件的刷新间隔,使文件在写入期间可读,因为片段以其最终形式刷新到文件中。finishWriting 只需要将 moov 原子附加到文件的末尾,而不是触及已经写入的片段。
于 2013-01-09T19:22:27.537 回答