Что в действительности должен делать OptimizeForNetworkUse?
Из документации Apple просто сказано:
Если значение этого свойства равно YES, выходной файл будет записан таким образом, что воспроизведение может начаться только после загрузки небольшого объема файла.
Но что на самом деле происходит?
1 ответ
Если для shouldOptimizeForNetworkUse задано значение YES, то при вызове finishWriting переместится атом moov MP4 (атом фильма) из конца файла в начало файла. Атом moov содержит информацию о файле фильма, такую как шкала времени и продолжительность. Moov также содержит "субатомы", которые содержат такую информацию, как дорожки, смещения данных в файле и т. Д.
Воспроизведение возможно только с использованием информации в атоме moov, и когда она расположена в начале файла, а не в конце файла, проигрыватель фильмов может начать воспроизведение файла, даже если он только загрузил его начало.
На практике современные браузеры извлекают атом moov из конца файла, используя заголовок диапазона HTTP/1.1 для загрузки атома moov, даже если он находится в конце файла.
При установке значения shouldOptimizeForNetworkUse в YES также есть несколько побочных эффектов:
- Завершение фильма занимает немного больше времени, потому что файл должен быть изменен вместе со смещениями в атоме.
- Выходной файл заблокирован и недоступен, потому что для FinishWriting потребуется изменить весь файл (переместить и обновить атомы). Если установлено значение NO, movieFragmentInterval устанавливает интервал сброса для записи в выходной видеофайл, делая файл читаемым во время записи, когда фрагменты сбрасываются в файл в окончательном виде. FinishWriting просто нужно добавить атом Moov в конец файла, а не касаться уже написанных фрагментов.