shouldOptimizeForNetworkUse实际上做了什么?

时间:2012-10-19 18:11:58

标签: objective-c ios avfoundation avassetwriter avassetexportsession

来自Apple documentation它只是说:

  

当此属性的值为YES时,输出文件将为   以这样一种方式编写,即播放只能在一小段时间后开始   下载文件的数量。

但究竟发生了什么?

1 个答案:

答案 0 :(得分:57)

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

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

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

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

  • 完成电影需要更长时间,因为文件必须与原子中的偏移一起修改。
  • 输出文件已锁定且无法访问,因为finishWriting需要修改整个文件(移动和更新原子)。设置为NO时,movieFragmentInterval设置用于写入输出视频文件的刷新间隔,使文件在写入期间可读,因为片段以最终形式刷新到文件。 finishWriting只需要将moov原子附加到文件的末尾,而不是触及已经写好的片段。