Восстановление повреждённого mp4-видео

Дмитрий Корнев
5 января, 21:49

Формат mp4 не самый лучший в плане отказоустойчивости. Он требует обязательного правильного завершения процесса записи. Если запись внезапно прерывается, то файл mp4 получается «битым». Его нельзя просмотреть. И восстановить тоже бывает проблематично. В этой статье описано несколько способов восстановления повреждённых mp4-файлов. Я опробовал их в Elementary OS 5.1 — это та же Ubuntu 18.04.

Мой автомобильный видеорегистратор имеет дохлый аккумулятор. Запись видео идет в формат 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
 Создан: -

Комментарии