Как открыть и восстановить видео файл m4v или mp4?

59

Вчера я снимал сцену с моим телефоном, но внезапно приложение упало, и когда я пытаюсь открыть сгенерированный m4v, он говорит, что поврежден.

Я загрузил видеофайлы (около 36 МБ) на свой компьютер и пытаюсь открыть и восстановить их. Можете ли вы предложить мне способ сделать это?

FFMPEG информация

Как предлагается в комментариях, я пытаюсь проверить, что FFMPEG говорит мне об этом файле с этой командой

ffmpeg.exe -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt

Вот это результат:

ffmpeg version N-40126-ga4b58fd Copyright (c) 2000-2012 the FFmpeg developers
  built on Apr 26 2012 03:29:50 with gcc 4.6.3
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass --enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 47.100 / 51. 47.100
  libavcodec     54. 15.100 / 54. 15.100
  libavformat    54.  3.100 / 54.  3.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 72.100 /  2. 72.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 11.100 /  0. 11.100
  libpostproc    52.  0.100 / 52.  0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 003fc940] moov atom not found
VID_20120425_144739.m4v: Invalid data found when processing input

Последние две строки отображаются красным цветом.

селезень
источник
Моя ОС - Windows 7, но при необходимости я могу подготовить виртуальную машину с дистрибутивом на основе Linux.
Дрейк
@slhck Спасибо за помощь, я сделал то, что вы предложили, и обновил вопрос.
Дрейк
7
Ах, это то, что я ожидал. Атом MOOV - это фрагмент данных, который необходим для доступа к необработанным видеопотокам внутри контейнера MP4 / M4V. В Интернете есть множество инструментов для «восстановления видео», но я бы не стал доверять большинству из них. Вы можете, конечно, дать им шанс - просто не платите ни за что. Многообещающим выглядит Untrunk , который, похоже, закодирован именно для этой проблемы (а именно отсутствующего атома MOOV). Или AtomicParsley . Удачи!
slhck
1
Как я могу исправить сломанный mp4 с AtomicParsley?
Чови

Ответы:

60

Можно восстановить поврежденный файл mp4 или m4v с помощью Untrunc .

Для этого метода вам нужен еще один видеофайл с того же устройства, который не сломан.

Как установить untrunc

Для компиляции вам понадобится установка Linux (в идеале Ubuntu) и базовые возможности использования командной строки. Вы также можете пропустить эту часть и запустить untruncчерез Docker (см. Ответ ниже ), если он у вас есть.

Вот что нужно сделать:

  1. Установите несколько обязательных библиотек с помощью этой команды:

    sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev

  2. Получите исходный код для Untrunc из репозитория GitHub (выберите один метод):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • или же git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Скомпилируйте исходный код с помощью этой команды (все в одной строке):

    g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil

    (вы можете попробовать пропустить этот шаг и использовать готовый исполняемый файл, но у меня это не сработало)

  4. Тогда вы действительно можете исправить видео. Вам нужно как сломанное видео, так и пример рабочего видео.

Как исправить видео

Найдите другое рабочее видео, в идеале с той же камеры и желательно по крайней мере столько же, сколько сломанное; также то же самое разрешение, если это возможно (я думаю, что это может помочь, хотя и не обязательно).

Запустите эту команду в папке, где вы распаковали и скомпилировали Untrunc, но замените /path/to/...биты двумя вашими видеофайлами:

./untrunc /path/to/working-video.m4v /path/to/broken-video.m4v

Затем он должен сжать и, надеюсь, создать воспроизводимый файл под названием broken-video_fixed.m4v

Вот и все, что вы сделали!

VLC Media Player теперь должен воспроизводить файл. Однако это может быть сообщение о неверной информации о длине (Untrunc пытается угадать / разобраться с этим, но не всегда делает это правильно). Чтобы это исправить, попробуйте перекодировать видео через другую программу.

[Спасибо комментарию slhck за предложение попробовать Untrunc.]

[Большое спасибо Федерико Пончио за то, что он в первую очередь написал Untrunc, чтобы решить эту проблему.]

sparrowt
источник
Круто, спасибо за предоставление полной инструкции здесь!
slhck
3
Спасибо @Alex Я обновил ссылку. Забавный файл Readme на github основан на этом ответе!
Воробей
1
Дало бы решение на основе Windows. < superuser.com/questions/938185/recover-incomplete-video-files >, поскольку у меня нет доступа в Интернет в моих дистрибутивах Linux.
Бродяга
2
FWIW это не произвело для меня ни одного воспроизводимого видео - но запуск recovery_mp4_to_h264 через wine работал хорошо.
Компилятор
1
У меня работал Untrunc, но мне пришлось поместить оба видеофайла в подкаталог скрытой папки .untrunc untrunc-master. Затем запустите: ./untrunc goodfile.mp4 badfile.mp4 Это заняло около 3 минут для файла 2 ГБ, и мне нужно было только повторно синхронизировать звук. Все остальное было в порядке.
user8547
8

Если кто-то наткнулся на это, я также попробовал приложение, о котором говорил воробей, но у меня это не сработало (см. Некоторые отчеты об ошибках, которые я создал в репозитории разработчиков). Может быть, это потому, что это был не файл mp4, а файл MOV ...

Мне помог этот пост: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Они ссылаются на программу под названием «HD Video Repair Utility» ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), которая намного дешевле, чем Treasured ( http://aeroquartet.com/movierepair/repair ). , Они даже указали, что существует более ранняя его версия (версия 1.5), которая ничего не стоит ( http://nagasoft.cn/download/videorepair1.5.zip )!

Я попытался восстановить файл, используя версию 1.5, и получил его частично работающим. После перекодирования с помощью ffmpeg (там есть ошибки) я понял, что часть звука пропала. В журналах (к счастью, есть утилита Video Repair Utility) больше не упоминалось аудио после определенного времени. Я возьму это как есть ...

SimonSimCity
источник
3
URL-адрес DROPBOX мертв. нашел альтернативу: nagasoft.cn/download/videorepair1.5.zip
T.Todua
2
@ T.Todua, спасибо за уведомление. Я заменил дропбокс-ссылку на предоставленную вами ссылку.
SimonSimCity
8

Вы можете установить docker(доступно для всех основных операционных систем) и запустить:

docker run -v $(pwd):/vol -it synctree/untrunc /vol/GOOD-reference-file.MP4 /vol/BAD-corrupt-file.mdt

Синтаксис для Bash под Linux или macOS. Здесь, GOOD-reference-file.MP4и BAD-corrupt-file.md5оба должны быть в вашем текущем каталоге, и каталог будет смонтирован /volв контейнере Docker.

Прочитайте другие комментарии вокруг для более подробного объяснения.

Это было самым быстрым для меня!

abourget
источник
Спасибо @slhck, Dockerfileэто доступно здесь, если кто-то захочет увидеть, что это будет запущено, прежде чем выполнять его на вашем компьютере: github.com/synctree/docker-untrunc В настоящее время есть Dockerfileи реальный untruncрепозиторий - я не тестировал ни, ни сравнивал их подробно, но
упомяните
7

@sparrowt Ваши текущие инструкции не работали на моей последней установке Ubuntu 16.10. Я получил следующую ошибку при компиляции Untrunc:

track.cpp: In member function ‘int Codec::getLength(unsigned char*, int)’:
track.cpp:204:40: error: ‘avcodec_alloc_frame’ was not declared in this scope
   AVFrame *frame = avcodec_alloc_frame();

Как объясняется в репозитории untrunc , вам может потребоваться загрузить libav отдельно, а не использовать версию в репозитории Ubuntu. Следующий код работал для меня:

sudo apt-get install unzip yasm g++ zlib1g-dev libbz2-dev
cd /tmp/
wget https://github.com/ponchio/untrunc/archive/master.zip
unzip master.zip
cd untrunc-master
wget http://libav.org/releases/libav-12.2.tar.xz
tar xvf libav-12.2.tar.xz
cd libav-12.2
./configure
make
cd ..
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -I./libav-12.2 -L./libav-12.2/libavformat -lavformat -L./libav-12.2/libavcodec -lavcodec -L./libav-12.2/libavresample -lavresample -L./libav-12.2/libavutil -lavutil -lpthread -lz -lbz2
./untrunc /path/to/working-video.mp4 /path/to/broken-video.mp4

Это создало файл с именем broken-video_fixed.mp4, который работал для меня. Большое спасибо за инициирование этой темы.

freeseek
источник
1
Спасибо! В строке компиляции unrrunc у меня было несколько ошибок в соответствии с «неопределенной ссылкой на« BZ2_bzDecompressInit »», мне пришлось добавить -lbz2
Andrew Smart
Он не может обрабатывать большие файлы. Просто сдается.
Кен Шарп
Ваш libav содержит h264dec.h? потому что track.cppпытается включить его, и я не могу найти его где-либо: /
x29a
Эта зависимость была добавлена ​​с помощью commit github.com/ponchio/untrunc/commit/… 10 октября 2017 года. Полагаю, теперь вам нужно загружать libav-12.2, а не libav-0.8.7
freeseek
Наконец-то получил это для работы на Ubuntu 14.04.5 LTS. Пришлось бежать sudo apt-get install yasm, sudo apt-get install libbz2-devи, чтобы преодолеть неопределенную ссылку на «clock_gettime», добавить -lrtв конце g++командной строки (см stackoverflow.com/a/2418175/550712 ). Преобразовано около 2/3 моего видео.
Марк Берри
2

Если untrunc не поддерживает кодек внутри вашего файла, вы можете попытаться исправить это с помощью шестнадцатеричного редактора:

  1. получить другой файл с тем же форматом, я получил больший, но, вероятно, подойдет любая длина
  2. открыть оба файла в шестнадцатеричном редакторе
  3. замените mdatраздел в файле «ok» на mdatраздел в «сломанном» файле без заголовка (т.е. копируйте только байты после «mdat»)
  4. это, вероятно, уже будет работать так, если нет, то 4 байта перед 'mdat' указывают размер mdatраздела, текущее значение будет старым размером ("нормально" mdatразмер раздела файла ), замените его новым размером (" битый » mdatразмер раздела файла )

В итоге я написал простую программу для этого: https://github.com/golimarrrr/fix-3gp

Как программа, так и вручную с помощью шестнадцатеричного редактора должны создать один и тот же фиксированный файл.

golimar
источник
-3

Вы пытались открыть файл с VLC Player ? Обычно он неплохо восстанавливает поврежденные файлы.

Карлос Манта
источник
8
Я думаю, что это может относиться к файлам AVI, где индекс может быть встроен в память, но файл MP4 с ошибкой «атом moov не найден» во время обработки ffmpeg ничего не воспроизводит в VLC.
Солнце
2
В моем случае VLC также не может его воспроизвести (файл .mov)
rogerdpack