Добавлять видеокадры в mp4 во время воспроизведения

Мне нужно добавить видеокадры, взятые из потока, в существующий файл mp4. Я обнаружил, что мне нужно использовать атом mdat и stco для обновления таблицы чанков. Можно ли вообще добавлять новые кадры/фрагменты? Мне нужно сделать это в приложении ios.


person Sergey Zenchenko    schedule 04.04.2012    source источник


Ответы (1)


Такое добавление возможно, но может оказаться непрактичным, особенно если вы хотите добавлять по одному кадру за раз.

MP4 — это очень «запеченный» формат, который трудно изменить после того, как он был сгенерирован. Это связано с тем, что структурные данные в поле «moov» содержат файловые смещения важных мультимедийных данных в поле «mdat». Если поле moov расположено перед полем mdat (обычно для обеспечения прогрессивной загрузки), то любые данные, добавляемые в поле moov (т. е. ссылки на новые ключевые кадры в добавленном видео), будут отодвигать поле mdat дальше. Вам придется не только переписать файл, но и соответствующим образом обновить все смещения файла. (Возможно, есть какие-то хитрые приемы для сохранения постоянного размера блока moov...) Если блок mdat расположен первым, операция все равно будет неудобной, потому что вам нужно будет скопировать блок moov в память, добавить новое видео в конец mdat, соответствующим образом обновите поля moov и добавьте новое поле moov.

Если вы можете собрать все новые видеокадры и в конце записи добавить их во время операции перезаписи, это может сработать. Вы также можете изучить Fragmented MP4 (используя блоки «moof»), но я не уверен, насколько широко распространена поддержка чтения таких файлов.

person David Simmons    schedule 25.04.2012