Формат mp4 не самый лучший в плане отказоустойчивости. Он требует обязательного правильного завершения процесса записи. Если запись внезапно прерывается, то файл mp4 получается «битым». Его нельзя просмотреть. И восстановить тоже бывает проблематично. В этой статье описано несколько способов восстановления повреждённых mp4-файлов. Я опробовал их в Ubuntu.
Мой автомобильный видеорегистратор имеет дохлый аккумулятор. Запись видео идет в формат mp4. При отключении питания происходит мгновенное аварийное завершение записи. Текущий mp4-файл неизбежно получается повреждённым. Именно такой файл я и пытался восстановить. Один из способов мне помог.
Плеер VLC
Многие советуют этот плеер. Он имеет алгоритмы, позволяющие просмотреть повреждённые видеофайлы. Наверное этот вариант подойдёт, когда файл повреждён не сильно. Сомневаюсь, что это пригодно для mp4 и описанного повреждения. Но попробовать не сложно. Мне не помогло.
Видеоредактор
Это еще один способ из числа простых. Пробуйте открыть повреждённое mp4-видео каким-нибудь видеоредактором. Любым, какой у вас есть в системе. Если есть, пробуйте несколько редакторов. Я пробовал Kdenlive. Мне не помогло, программа сообщала «Некорректный клип».
FFmpeg
Это набор свободных библиотек для работы с видео и звуком. Они уже должны быть в системе, т.к. используются многими программами. Через консоль FFmpeg можно использовать напрямую. Возможности очень широкие! Можно попытаться восстановить повреждённый файл. Несколько команд, которые можно опробовать:
ffmpeg -i повреждённый.mp4 -vcodec copy -acodec copy восстановленный.mp4
ffmpeg -i повреждённый.mp4 -vcodec copy -acodec copy -movflags faststart восстановленный.mp4
ffmpeg -i повреждённый.mp4 -vcodec rawvideo -acodec pcm_s16le восстановленный.avi
Мне не помогло, в любом случае получал одну и ту же ошибку:
d1mon@d1monPC:~/1$ ffmpeg -i 1.mp4 -vcodec copy -acodec copy 2.mp4
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f33f5417e0] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f33f5417e0] moov atom not found
1.mp4: Invalid data found when processing input
Untrunc
Это специальная программа для восстановления повреждённых файлов mp4, m4v, mov, 3gp video. На официальном сайте написано, как ее установить в Ubuntu. У меня не получилось это сделать. Я нашел более современный форк этой программы, который установился без проблем. Заодно там говорится и про ряд улучшений, по сравнению с оригинальной версией, так что это даже более предпочтительный вариант. На github у той и другой программы много звезд, т.е. кому-то они явно помогали. Попробовать обязательно стоит.
Установка форка:
sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev
git clone https://github.com/anthwlock/untrunc.git
cd untrunc
make
sudo cp untrunc /usr/local/bin
Команда восстановления:
untrunc восстановленный.mp4 повреждённый.mp4
Внимательнее! Здесь порядок перечисления восстановленного и поврежденного файлов в команде обратное.
В моем случае снова неудача:
d1mon@d1monPC:~/1$ untrunc 1.mp4 2.mp4
Info: version '' using ffmpeg '3.4.6-0ubuntu0.18.04.1'
Info: reading 1.mp4
Info: parsing healthy moov atom ...
invalid atom name: ' '
Mp4fixer
Это еще более интересная программа для восстановления. Она предназначена для битых, удаленных, недописанных файлов mp4, mov, 3gp, внутри которых было h264 видео. Автор пишет, что может подойти и для avi, mkv, m4v и т.д., но восстановление звука может быть осложнено. Сразу скажу, что мне этот вариант помог!
Программа Mp4fixer не просто пытается восстановить файл. Она делает это после анализа дополнительного целого (не повреждённого) файла, записанного тем же устройством. За счёт этого шансы значительно выше. Ведь тех данных, которых нет в повреждённом файле, она возьмёт из целого. В случае видеорегистратора — это идеальный вариант. Такие устройства записывают видео фрагментами. Просто берем в качестве образца рядом лежащий фрагмент, с воспроизведением которого нет проблем.
Программа не требует установки. По сути, это и не программа, а скрипт на perl.
Скачайте с официального сайта или клонируйте:
git clone https://github.com/bookkojot/mp4fixer.git
Скопируйте файл fixer.pl
в тот каталог, где у вас повреждённый mp4 и запускайте восстановление:
perl fixer.pl целый.mp4 повреждённый.mp4 prefix
В итоге получим несколько файлов, среди которых будет с расширением .h264
, например prefix-out-video.h264
— это восстановленное видео. Будет еще prefix-out-audio.raw
— это восставленный звук. Можно их объединить в каком-нибудь видеоредакторе.
Видеофайл формата .h264 можно воспроизвести видеоплеером, например mpv или vlc это точно умеют.
Частичный пример успешного восстановления:
d1mon@d1monPC:~/1$ perl fixer.pl 0.mp4 1.mp4 prefix
Build intemidiates...
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '0.mp4':
Metadata:
major_brand : avc1
minor_version : 0
compatible_brands: avc1isom
creation_time : 2019-12-27T17:50:56.000000Z
Duration: 00:03:00.18, start: 0.000000, bitrate: 13043 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080 [SAR 1:1 DAR 16:9], 12008 kb/s, 29.97 fps, 29.97 tbr, 180k tbn, 59.94 tbc (default)
Metadata:
creation_time : 2019-12-27T17:50:56.000000Z
handler_name : Ambarella AVC
encoder : Ambarella AVC encoder
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2019-12-27T17:50:56.000000Z
handler_name : Ambarella AAC
Stream #0:2(eng): Subtitle: mov_text (text / 0x74786574), 0 kb/s (default)
Metadata:
creation_time : 2019-12-27T17:50:56.000000Z
handler_name : Ambarella EXT
...
...
...
Файл: prefix-out-video.h264
Размер: 124491548 Блоков: 243152 Блок В/В: 4096 обычный файл
Устройство: fd00h/64768d Inode: 3022284 Ссылки: 1
Доступ: (0664/-rw-rw-r--) Uid: ( 1000/ d1mon) Gid: ( 1000/ d1mon)
Доступ: 2020-01-05 21:36:06.081076091 +0500
Модифицирован: 2020-01-05 21:36:11.885175216 +0500
Изменён: 2020-01-05 21:36:11.885175216 +0500
Создан: -
Windows
В комментариях часто пишут владельцы Windows. Пишут, что у них не получается использовать скрипт и т.д. Обращаю внимание, что данная статья писалась для пользователей Linux. Вначале статьи написано, что всё сказанное было опробовано в Ubuntu.
На официальном сайте скрипта Mp4fixer написано, что его можно использовать и в Windows. Но у меня нет этой системы и я не пробовал выполнять в ней восстановление. Спрашивать меня по этому вопросу бессмысленно.
Нулевой результат
Ко мне обращались с просьбой помочь восстановить файл MP4. В комплекте с поврежденным файлом был исправный. Я пробовал использовать Mp4fixer, но результат оказался нулевым. В прямом смысле — файлы .h264 и .raw были на выходе нулевого размера. Тогда я присмотрелся к поврежденному файлу. Его размер был вполне приемлемым — 60Мб. Но когда я его открыл текстовым редактором, то всё стало понятно — данных для восстановления внутри просто нет.
На следующей картинке внутренности файлов. В первом случае это мой поврежденный файл. Очевидно, что здесь есть какие-то данные. Нормальные файлы выглядят внутри примерно также. Во втором случае поврежденное видео, которое не удалось восстановить. Там бесконечно повторяется один и тот же символ. Это означает, что в данном файле действительно нет полезной информации. Восстанавливать нечего.
На сайте автора скрипта есть упоминание про записывающие устройства, работающие по особому алгоритму, в которых запись осуществляется одновременно в несколько файлов. Возможно, что в данном случае мы имеем дело с чем-то подобным. В любом случае это означает, что может быть данные ещё можно восстановить, но они находятся на карте памяти в каком-нибудь другом вспомогательном файле. Важно не вносить никакие изменения на карте, не использовать её, она должна быть неприкосновенна. Средства для восстановления нужно использовать принципиально другие. Какие? Я не знаю. Изучите для начала информацию, которую предлагает автор скрипта. Там он что-то рекомендует.