Восстановление повреждённого видеофайла с квадрокоптера
Invite pending
Случилось страшное: съездил в очередное интересное место в области (так как заграницы нынче недоступны), отлетал и отснимал на Мавике хороший материал, добрался до компьютера, чтобы его обработать, и внезапно:

Казалось бы, не страшно, такое бывает, и нам поможет VLC или ffmpeg, но они так же отказались как-либо воспроизводить файл. Так как ехать снова пару сотен километров с целью переснять материал было вообще не вариант, стал искать пути решения проблемы.
Обычно я веду съёмку с квадрокоптера непрерывно, так как нередко бывали моменты, что либо забываешь нажать на кнопку начала съёмки, либо, что ещё более обидное, вместо старта съёмки останавливаешь её, а вместо остановки — начинаешь, так как кнопка старт/стоп одна. Так что пишу видео нон-стоп, а потому уже нарезаю в видеоредакторе как нужно. Видео же пишется, сохраняясь в файлы по 4 гигабайта.
Итого, у меня есть два файла: первый битый, и второй нормальный. Беглое изучение байт-кода первого файла показало, что он не пуст, то есть проблема была именно в завершении записи файла. Стоит отметить, что за несколько лет использования Мавика такая ситуация сложилась впервые.
Беглые поиски решения проблемы привели к утилите untrunc. Суть утилиты в том, что на вход ей требуются два файла: нечитаемый и корректный. И обязательное условие для файлов: они должны быть сняты одним и тем же устройством. Как раз мой случай!
Но если для пользователей Windows предлагается уже готовое решение, всем остальным предлагается сбилдить утилиту самостоятельно, благо, есть подробная инструкция. И вот не знаю, то ли делал я что-то не так, то ли ещё что, но ни локально в OSX, ни в контейнере Ubuntu 16.04 сбилдить утилиту, следуя инструкциям, у меня не получилось. И хотел я уже было оставить попытки завести untrunc, как наткнулся на пункт в инструкции про докер-контейнер. Итог: если у вас есть установленный Docker, проблема с незавершённым видеофайлом решается буквально в несколько команд:
А именно:
Для двух файлов 4К, размер «битого» — 4 гигабайта, размер читающегося — 3 гигабайта, весь процесс занял примерно две с половиной минуты. Ну и ещё менее минуты предварительно на билд контейнера. В результате был создан читающийся всеми проигрывателями файл DJI_0001.MOV_fixed.MOV, и что интересно, так это что его размер вопреки ожиданиям не увеличился, а наоборот уменьшился на 640 килобайт.
В результате проблема решена, можно смело переходить к видеомонтажу:


Казалось бы, не страшно, такое бывает, и нам поможет VLC или ffmpeg, но они так же отказались как-либо воспроизводить файл. Так как ехать снова пару сотен километров с целью переснять материал было вообще не вариант, стал искать пути решения проблемы.
Обычно я веду съёмку с квадрокоптера непрерывно, так как нередко бывали моменты, что либо забываешь нажать на кнопку начала съёмки, либо, что ещё более обидное, вместо старта съёмки останавливаешь её, а вместо остановки — начинаешь, так как кнопка старт/стоп одна. Так что пишу видео нон-стоп, а потому уже нарезаю в видеоредакторе как нужно. Видео же пишется, сохраняясь в файлы по 4 гигабайта.
Итого, у меня есть два файла: первый битый, и второй нормальный. Беглое изучение байт-кода первого файла показало, что он не пуст, то есть проблема была именно в завершении записи файла. Стоит отметить, что за несколько лет использования Мавика такая ситуация сложилась впервые.
Беглые поиски решения проблемы привели к утилите untrunc. Суть утилиты в том, что на вход ей требуются два файла: нечитаемый и корректный. И обязательное условие для файлов: они должны быть сняты одним и тем же устройством. Как раз мой случай!
Но если для пользователей Windows предлагается уже готовое решение, всем остальным предлагается сбилдить утилиту самостоятельно, благо, есть подробная инструкция. И вот не знаю, то ли делал я что-то не так, то ли ещё что, но ни локально в OSX, ни в контейнере Ubuntu 16.04 сбилдить утилиту, следуя инструкциям, у меня не получилось. И хотел я уже было оставить попытки завести untrunc, как наткнулся на пункт в инструкции про докер-контейнер. Итог: если у вас есть установленный Docker, проблема с незавершённым видеофайлом решается буквально в несколько команд:
% git clone https://github.com/anthwlock/untrunc.git && cd untrunc
% docker build -t untrunc .
% cd ..
% docker run -v `pwd`:/mnt untrunc /mnt/DJI_0002.MOV /mnt/DJI_0001.MOV
А именно:
- клонируем репозиторий
- запускаем из его каталога билд контейнера
- запускаем сам контейнер с монтированием каталога с видео и указанием «небитого» и «битого» видеофайлов.
Для двух файлов 4К, размер «битого» — 4 гигабайта, размер читающегося — 3 гигабайта, весь процесс занял примерно две с половиной минуты. Ну и ещё менее минуты предварительно на билд контейнера. В результате был создан читающийся всеми проигрывателями файл DJI_0001.MOV_fixed.MOV, и что интересно, так это что его размер вопреки ожиданиям не увеличился, а наоборот уменьшился на 640 килобайт.
В результате проблема решена, можно смело переходить к видеомонтажу:
