Эта статья предназначена для тех, кто заинтересован в сохранении воспроизводимости своих записей в случае внезапного сбоя системы.
Далее будут описаны характерные особенности неповрежденных и поврежденных файлов, записанных в нескольких наиболее известных форматах, таких как MP4, MOV, MKV, FLV, а также рассмотрены особенности изменения структуры файлов при различных условиях записи.
.
Весь
МП4
Данная группа файлов была записана в обычных условиях без угрозы внезапной остановки записи.Вы можете заметить, что файл состоит из четырех атомов корневого уровня ftyp, free, mdat, moov, в соответствии со структурой, описанной в разделе официальная спецификация формата медиаконтейнера MP4 .
Все значения в таблице представлены в байтах.
В первом столбце отображается начало блока памяти для каждого атома, во втором — размер данных, занимаемых атомом.
Таким образом, расположение каждого следующего атома в памяти представляет собой сумму размеров всех предыдущих атомов.
Рис.
1 Структура стандартного файла MP4 Содержимое атома moov особенно важно для воспроизведения видеоматериала, поскольку именно в этом месте находится описание информации о том, как следует расшифровать файл.
Для расшифровки файла с целью его воспроизведения необходимо установить взаимно однозначное соответствие между данными и методами его чтения.
Поэтому необходимо знать количество потоков, какой формат данных содержат потоки и какие кодеки совместимы для декодирования.
Следует обратить внимание на расположение атома moov в памяти файла.
Обычно он находится в конце файла, что не всегда полезно и безопасно при записи.
По этой причине не рекомендуется записывать в MP4 из-за риска получить невоспроизводимый файл, если запись внезапно прекратится.
Такая ситуация возможна из-за сбоев системы, потери питания и неожиданного завершения процесса записи ПО.
Метаданные извлекаются с помощью ffprobe следующим образом.
ffprobe -hide_banner video.mp4 2> mp4.txt
Рис.
2 Метаданные стандартного файла MP4
МОВ
Структура MOV особо не отличается от структуры MP4; файл по-прежнему состоит из четырех атомов корневого уровня, но вместо свободного атома используется широкий атом такого же размера.Такие атомы содержат информацию о неиспользуемом пространстве памяти.
Вы можете узнать больше о формате медиаконтейнера MOV в официальная спецификация формата медиаконтейнера MOV .
Рис.
3 Структура стандартного файла MOV В MOV, как и в MP4, все метаданные расположены в атоме moov в конце файла.
Метаданные извлекаются с помощью ffprobe следующим образом.
ffprobe -hide_banner video.mov 2> mov.txt
Рис.
4 Стандартные метаданные файла MOV
МКВ
Структура MKV уже была описана ранее в официальная спецификация формата медиаконтейнера MKV .Основное отличие от двух предыдущих форматов контейнеров заключается в том, что данные по умолчанию записываются небольшими фрагментами, а не одним общим блоком информации в случае mdat для MP4 и MOV. Эта функция позволяет избавиться от проблемы критического повреждения файла в случае внезапной остановки записи, поскольку метаданные содержатся в каждом отдельном фрагменте.
Метаданные извлекаются с помощью ffprobe следующим образом.
ffprobe -hide_banner video.mkv 2> mkv.txt
Рис.
5 метаданных файла MKV
FLV-файл
Структура MKV уже была описана ранее в официальная спецификация формата медиаконтейнера FLV .Для хранения информации используется метод, идентичный MKV. Видео располагается в памяти фрагментами, но содержимое атомов разное.
Метаданные извлекаются с помощью ffprobe следующим образом.
ffprobe -hide_banner video.flv 2> flv.txt
Рис.
6 Метаданные FLV-файла
Поврежденный
МП4
Если запись внезапно прервалась, есть достаточно большая вероятность получить на выходе невоспроизводимый файл.
Рис.
7 Ошибка воспроизведения файла MP4 Подробнее о причине ошибки можно узнать, просмотрев логи с помощью ffprobe в консоли.
ffprobe -v error video.mp4 2> mp4_error.txt
Журнал ошибок для файла выглядит так
Рис.
8 Журнал ошибок для video.mp4 По ошибке «атом moov не найден» можно понять, что метаинформацию извлечь невозможно, так как атом moov не найден.
Дело в том, что запись закончилась раньше запланированного и атом moov физически не был записан в память.
Последним доступным атомом в этом случае будет mdat.
Рис.
9 Структура поврежденного файла MP4 Соответственно, если вы попытаетесь получить какую-либо метаинформацию файла, вывод будет пустым.
Например, ffprobe -hide_banner video.mp4 2> mp4.txt
Рис.
10 Метаданные поврежденного файла MP4
МОВ
В файлах MOV будет наблюдаться аналогичная ситуация, но, как и в прошлый раз, разница будет лишь в названии и размере некоторых корневых атомов структуры.Сам файл не воспроизводится.
ffprobe -v error video.mov 2> mov_error.txt
Рис.
11 Журнал ошибок для video.mov Атом Moov здесь не наблюдается, как в MP4, что не позволяет извлечь метаинформацию
Рис.
12 Структура поврежденного файла MOV ffprobe -hide_banner video.mov 2> mov.txt
Рис.
13 Метаданные поврежденного файла MOV
МКВ
Файл MKV, записанный в условиях внезапной остановки записи, пострадает меньше, чем MP4 или MOV. В него можно играть, но нельзя перемотать назад и узнать продолжительность в некоторых плеерах.Это можно проверить после извлечения метаданных.
Значение поля Duaration — N/A, что означает, что оно не было определено.
Также отсутствуют значения продолжительности видео и аудио потоков и битрейта.
Рис.
14 Метаданные поврежденного файла MKV Вывод метаданных по поврежденному файлу MKV будет сопровождаться сообщением о преждевременном окончании файла, но в данном случае это затронет только последний фрагмент, во время которого запись была прервана.
Рис.
15 Журнал ошибок для video.mkv
FLV-файл
Поврежденный FLV-файл воспроизводится, но также не имеет определенного значения длины, записанного в поле «Длительность», как и поврежденный MKV-файл, однако сохраняется информация об исходной временной метке.Что касается битрейта, то его пока нет. Дело в том, что значения полей Длительность и Битрейт рассчитываются в самом конце, а не пересчитываются каждый раз после окончания записи каждого отдельного фрагмента, так как это вызвало бы дополнительную нагрузку на систему.
Рис.
16 Метаданные поврежденного FLV-файла Вывод поврежденного FLV-файла содержит немного больше информации о повреждении.
Вы можете увидеть, на каком пакете прервалась запись и к какому потоку она принадлежала.
В данном случае проблема обнаружилась при декодировании пакета в видеопотоке с dts=9734. Более вероятно, что ошибка возникнет в видеопотоке, так как обычно объем видеоданных занимает во много раз больше места, чем аудио , и соответственно на его декодирование тратится пропорционально больше времени.
DTS (отметка времени декодирования) — время декодирования опорного кадра, необходимое для отображения текущего в базовых единицах.
Может совпадать с PTS (отметкой времени представления), если текущий кадр является опорным.
Обычно базовая единица указывается в виде дроби с количеством тактов в числителе и частотой тактового генератора в знаменателе.
В результате в процессе расшифровки декодер не может получить доступ к объекту в памяти, поскольку его не существует и чтение завершается с ошибкой.
Рис.
17 Журнал ошибок для video.flv
Записано с предустановками
Предустановленная запись отличается от обычной записи тем, что дополнительной настройкой является параметр faststart, который помогает предотвратить проблему критического повреждения файлов MP4 и MOV путем перемещения атома moov в начало файла.
Для MKV и FLV этот параметр не имеет особого смысла, поскольку в их структуре нет отдельного атома с общими метаданными, как у moov.
Рис.
18 настроек записи OBS
МП4
Теперь поврежденный файл мог оставаться воспроизводимым и читаемым в случае внезапной остановки записи.На изображении ниже вы можете рассмотреть структуру файла, полученного после записи.
На этот раз атом moov был записан в начале файла после ftyp. Раньше он располагался в самом конце после атома mdat.
Рис.
19 Структура записанного файла MP4 Метаданные считываются повторно, и значения полей длительности и битрейта определяются, несмотря на то, что запись внезапно прервалась.
Рис.
20 Метаданные записанного файла MP4
МОВ
Структура файла MOV претерпела изменения в порядке записи корневых атомов, как и в MP4. Атом Moov остается нетронутым и располагается в начале файла.
На воспроизведение файлов это не влияет.
Рис.
21 Структура записанного файла MOV Кроме того, вы можете проверить целостность файла после извлечения метаданных.
Рис.
22 Метаданные записанного файла MOV
МКВ
Для файлов MKV параметр «faststart» не имеет особого эффекта; файл поврежден в результате внезапной остановки записи.
Рис.
23 Метаданные записанного файла MKV Файл можно воспроизвести, но как и в прошлый раз, без значений длительности и битрейта.
Вывод метаданных сопровождается ошибкой.
Рис.
24 Журнал ошибок для video.mkv
FLV-файл
Используемый параметр не дал особых изменений в лучшую сторону для flv-файла.Все старые проблемы остались.
Рис.
25 Метаданные записанного FLV-файла Длительность в результате записи остается нулевой, битрейт неизвестен, однако файл воспроизводится.
Рис.
26 Журнал ошибок для video.flv
Фрагментированный
Еще один вариант предварительной настройки записи, позволяющий добиться фрагментированной записи в файл вместо хранения всей информации в одном атоме.
- пустой_moov приведет к 100% фрагментации результатов; без этого первый фрагмент будет мультиплексирован как короткий фильм (с использованием moov), за которым последуют остальные медиафайлы во фрагментах.
- фрагмент_ключевого кадра вызывает фрагментированный вывод
Рис.
27 настроек записи OBS
МП4
Используя дополнительные параметры, можно было сохранить воспроизводимость файла даже в случае внезапной остановки записи.Заметны изменения в файловой структуре.
Атом Moov располагается в начале файла, за ним следует последовательность из двух атомов moof и mdat, повторяющаяся почти до конца.
Эти два атома содержат всю необходимую информацию о каждом отдельном видеофрагменте.
Атом Moof — аналог moov для фрагмента записи, mdat — атом, содержащий потоки.
Файл заканчивается атомом mfra.
Рис.
28 Структура фрагментированного файла MP4 В этом случае в извлечении метаданных нет ничего особенного.
В метаданных указана длительность, однако некоторые игроки не имеют возможности перемотки назад и не отображают длительность.
Рис.
29 Метаданные фрагментированного файла MP4
МОВ
Что касается структуры файла MOV, то она также сильно изменена и больше напоминает структуру файлов MKV или FLV за счет последовательности фрагментов, записанных в атомах moof и mdat.Рис.
29 Структура фрагментированного файла MOV В этом случае метаданные не пострадают.
Рис.
30 Метаданные фрагментированного файла MOV
МКВ
Никаких спецэффектов или изменений ни в худшую, ни в лучшую сторону нет.FLV-файл
Никаких спецэффектов или изменений ни в худшую, ни в лучшую сторону нет.Дополнительная информация
Мультиплексирование в obs осуществляется с помощью ffmpeg, поэтому все настройки, указанные в этом примере, будут выглядеть так: ffmpeg -i input <encoding parameters> -movflags +frag_keyframe+empty_moov out.[mp4/mov]
Пример создания фрагментированного файла MP4 (fMP4) из стандартного файла MP4.
ffmpeg -i video.mp4 -g 52 -c:a aac -c:v libx264 -f mp4 -movflags frag_keyframe+empty_moov fragmented_video.mp4
Альтернативная предустановка записи, которая позволяет выполнять фрагментированную запись в файл вместо хранения всей информации в одном атоме.
- пустой_moov приведет к 100% фрагментации результатов; без этого первый фрагмент будет мультиплексирован как короткий фильм (с использованием moov), за которым последуют остальные медиафайлы во фрагментах.
- отдельный_moof вызывает создание отдельного атома moof (видеофрагмента) для каждого потока.
Обычно пакеты для всех потоков записываются в moofatom (что немного более эффективно), но если эта опция установлена, мультиплексор записывает одну пару moof/mdat для каждого потока, что упрощает разделение дорожек.
- фрагмент_ключевого кадра вызывает фрагментированный вывод
- omit_tfhd_offset отключает запись абсолютного значения base_data_offset в атомах tfhd. Это позволяет избежать привязки фрагментов к абсолютным позициям байтов в файле/потоках.
Рис.
31 Настройки записи OBS
МП4
Следующие настройки позволяют создать фрагментированный MP4 (fMP4), который можно просмотреть во время преобразования.Однако для просмотра будут доступны только те фрагменты, которые полностью закодированы на момент запуска файла.
Для просмотра фрагментов, закодированных после этого момента, вам придется перезагрузить источник просмотра.
Рис.
32 Структура фрагментированного файла MP4 Как и в предыдущем примере фрагментации, файл состоит из последовательности атомов корневого уровня mdat и moof и имеет атом moov в начале.
Рис.
33 Метаданные полученного файла MP4 Таким образом, этот метод, наряду с предыдущим, позволяет избежать повреждения метаданных файла в случае внезапного прекращения записи, что фактически гарантирует возможность дальнейшего воспроизведения файла.
МОВ
Эти настройки также применимы в случае файлов MOV и дают на выходе сопоставимые результаты.
Рис.
34 Структура фрагментированного файла MOV В результате также сохраняются метаданные и нормальная воспроизводимость файлов.
Рис.
35 Метаданные полученного MOV-файла
МКВ
Никаких спецэффектов или изменений ни в худшую, ни в лучшую сторону нет.FLV-файл
Никаких спецэффектов или изменений ни в худшую, ни в лучшую сторону нет.Дополнительная информация
Мультиплексирование в obs осуществляется с помощью ffmpeg, поэтому все настройки, указанные в этом примере, будут выглядеть так: ffmpeg -i input <encoding parameters> -movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov out.[mp4/mov]
Заключение
Чтобы снизить вероятность потери доступа к записанным видеофайлам, лучше сразу задуматься о том, как избежать негативных последствий в случае возникновения аппаратных или системных проблем на записывающем устройстве.Это можно сделать, выбрав один из более отказоустойчивых форматов записи, например MKV/FLV, либо, если формат вывода принципиально важен, то воспользоваться одним из способов предотвращения сбоев в MP4/MOV из статьи.
Восстановить мертвый файл гораздо сложнее и не всегда возможно.
Для тех, кто уже столкнулся с этой проблемой и все еще ищет решения, может быть полезна следующая статья на тему восстановления файлов MP4/MOV.
Полезные источники
- ФФМПЕГ
- ФФПРОБ
- Спецификация MP4 / Краткое описание формата MP4
- Спецификация MOV / Краткое описание формата MOV
- Спецификация MKV / Краткое описание формата MKV
- Спецификация FLV-файла / Краткое описание формата FLV
-
Особенности Российской Онлайн-Торговли
19 Oct, 24 -
Наш Программируемый Мозг. Часть Третья
19 Oct, 24 -
Блокнот++ 4.0.2
19 Oct, 24 -
Toondoo Превратит Любого В Творца
19 Oct, 24 -
Ведьмак: Расширенное Издание
19 Oct, 24