Что в действительности должен делать OptimizeForNetworkUse?

Из документации Apple просто сказано:

Если значение этого свойства равно YES, выходной файл будет записан таким образом, что воспроизведение может начаться только после загрузки небольшого объема файла.

Но что на самом деле происходит?

1 ответ

Если для shouldOptimizeForNetworkUse задано значение YES, то при вызове finishWriting переместится атом moov MP4 (атом фильма) из конца файла в начало файла. Атом moov содержит информацию о файле фильма, такую ​​как шкала времени и продолжительность. Moov также содержит "субатомы", которые содержат такую ​​информацию, как дорожки, смещения данных в файле и т. Д.

Воспроизведение возможно только с использованием информации в атоме moov, и когда она расположена в начале файла, а не в конце файла, проигрыватель фильмов может начать воспроизведение файла, даже если он только загрузил его начало.

На практике современные браузеры извлекают атом moov из конца файла, используя заголовок диапазона HTTP/1.1 для загрузки атома moov, даже если он находится в конце файла.

При установке значения shouldOptimizeForNetworkUse в YES также есть несколько побочных эффектов:

  • Завершение фильма занимает немного больше времени, потому что файл должен быть изменен вместе со смещениями в атоме.
  • Выходной файл заблокирован и недоступен, потому что для FinishWriting потребуется изменить весь файл (переместить и обновить атомы). Если установлено значение NO, movieFragmentInterval устанавливает интервал сброса для записи в выходной видеофайл, делая файл читаемым во время записи, когда фрагменты сбрасываются в файл в окончательном виде. FinishWriting просто нужно добавить атом Moov в конец файла, а не касаться уже написанных фрагментов.
Другие вопросы по тегам