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

Дмитрий Корнев
5 января 2020

Формат 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Мб. Но когда я его открыл текстовым редактором, то всё стало понятно — данных для восстановления внутри просто нет.

На следующей картинке внутренности файлов. В первом случае это мой поврежденный файл. Очевидно, что здесь есть какие-то данные. Нормальные файлы выглядят внутри примерно также. Во втором случае поврежденное видео, которое не удалось восстановить. Там бесконечно повторяется один и тот же символ. Это означает, что в данном файле действительно нет полезной информации. Восстанавливать нечего.

Файлы MP4 внутри

На сайте автора скрипта есть упоминание про записывающие устройства, работающие по особому алгоритму, в которых запись осуществляется одновременно в несколько файлов. Возможно, что в данном случае мы имеем дело с чем-то подобным. В любом случае это означает, что может быть данные ещё можно восстановить, но они находятся на карте памяти в каком-нибудь другом вспомогательном файле. Важно не вносить никакие изменения на карте, не использовать её, она должна быть неприкосновенна. Средства для восстановления нужно использовать принципиально другие. Какие? Я не знаю. Изучите для начала информацию, которую предлагает автор скрипта. Там он что-то рекомендует.

12 комментариев

Ва
В общем неплохо. Хотя можно с подобного, неповреждённого файла этого же регистратора, вставить окончание (метаданные) в битый файл. Кстати, не фолк (Folk - народ), а фок (Fork - вилка, разветвление), но в русскоязычно среде произносят как обычно не правильно, а как пишется - форк.
Спасибо, поправил. Посмотрел целый и поврежденный файл, вручную не представляю как там можно взять конец. Там в файле ничего в понятом виде нет.
Юр
Здравствуйте! Удалил случайно видеоматериал, попробовал восстановить, вроде получилось, но файлы поврежденные, перепробовал много способов(включая untrunc) , ничего не помогает. файлы в формате mov, может быть вы сможете что-то подсказать?
На этот случай у меня нет решения. Была аналогичная ситуация, некоторые файлы после восстановления имеют повреждения в середине. Воспроизведение начинается нормально, но в какой-то момент прекращается и уже не восстанавливается. Лежат у меня такие файлы тоже, до лучших времен.
Bo
Здравствуйте. Подскажите пожалуйста что делаю не так. -Скачал архив с гита - fixer.pl положил в папку с двумя видеофайлами - запустил командную , прописал пусть к папке в которой все лежит и далее "perl fixer.pl 1.mp4 2.mp4 prefix на что получаю ответ: "perl" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Обратился к гуглу и немного запутался в ответах, то ставить что то , то не ставить, то еще что... я не совсем понимаю на ихнем примере сходство с моей проблемой , потому буду оч. признателен за ответ.
Если fixer.pl уже лежит в папке вместе с видеофайлами, то никакие пути прописывать не надо. Выполнять следует ровно так, как в примере perl fixer.pl ... Даже если просто выполнить perl fixer.pl то должна появится подсказка Usage: fixer.pl <good_file.mp4> <bad_file.mp4> <output_prefix>. Я проверил сейчас это на Ubuntu 20.04. Ничего специально ставить не надо. Все сразу работает. А какая у вас система?
Bo
windows 10
Не подскажу. С Windows уже очень давно не работаю. Может и можно скрипт использовать в Windows, но я про это ничего не знаю. Заглянул сейчас на сайт автора, там написано, что можно использовать и с Windows. Так что экспериментируйте.
Bo
При открытии командной строки изначально строка прописана как С:\Users\Username> вот я и решил прописать путь к той папке где все лежит, иначе я не совсем понимаю как система должна понимать что и откуда запускать. Или же я не совсем понмаю как и где писать тогда... Извените, редко стыкаюсь с подобными задачами, а со скриптами Perl так тем более. Потому буду оч. признателен за подсказку, уж очень хочу восстановить видео.
Bo
установил ActivePerl -что то запустилось, но пишет вот что... - c:\test_sum>perl fixer.pl good.mp4 1.mp4 prefix Build intemidiates... "ffmpeg.exe" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. "ffmpeg.exe" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. ...
Ни
у меня точно такая же проблема( один в один
Судя по всему скрипт не может найти программу ffmpeg.exe. Можно скачать и записать данный файл тоже в рабочий каталог. Должно помочь.