shouldOptimizeForNetworkUse实际上做了什么?

use*_*046 21 objective-c avfoundation ios avassetwriter avassetexportsession

Apple文档中它只是说:

当此属性的值为YES时,将以这样的方式写入输出文件,即只在下载少量文件后才能开始播放.

但究竟发生了什么?

小智 61

当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原子附加到文件的末尾,而不是触及已经写入的片段.