Objective c OptimizationForNetworkUse实际上应该做什么?

Objective c OptimizationForNetworkUse实际上应该做什么?,objective-c,ios,avfoundation,avassetwriter,avassetexportsession,Objective C,Ios,Avfoundation,Avassetwriter,Avassetexportsession,从表面上看,它只是说: 当此属性的值为“是”时,将显示输出文件 以这样一种方式写的,只需一小段时间就可以开始播放 文件的下载量 但是实际发生了什么?当shouldOptimizationForNetworkUse设置为YES时,调用finishWriting将MP4 moov atom(电影atom)从文件的末尾移动到文件的开头。moov原子包含有关电影文件的信息,如时间刻度和持续时间。moov还包含“子原子”,其中包含轨迹、文件中的数据偏移量等信息 只有使用moov atom中的信息才能播放,

从表面上看,它只是说:

当此属性的值为“是”时,将显示输出文件 以这样一种方式写的,只需一小段时间就可以开始播放 文件的下载量


但是实际发生了什么?

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

只有使用moov atom中的信息才能播放,当它位于文件的开头而不是文件的结尾时,电影播放器可以开始播放文件,即使它只加载了文件的开头

实际上,现代浏览器将使用HTTP/1.1 Range头从文件末尾获取moovatom,以加载moovatom,即使它位于文件末尾

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

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