50

Вчера я снимал сцену с моим телефоном, но внезапно приложение упало, и когда я пытаюсь открыть сгенерированный 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

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

6 ответов6

51

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

Для этого метода вам нужно:

  • другой видео файл, который не сломан

  • установка Linux (я использовал Ubuntu 12.04) и базовые возможности использования командной строки.

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

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

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

  2. Загрузите исходный код для Untrunc из репозитория github:

    wget https://github.com/ponchio/untrunc/archive/master.zip

  3. Разархивируйте исходный код:

    unzip master.zip

  4. Перейдите в каталог, где он был распакован:

    cd untrunc-master

  5. Скомпилируйте исходный код с помощью этой команды (все в одной строке):

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

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

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

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

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

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

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

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

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

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

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

6

Если кто-то еще наткнулся на это, я также попробовал приложение, о котором говорил воробей, но у меня это не сработало (см. Некоторые отчеты об ошибках, которые я создал в репозитории разработчиков). Может быть, это потому, что это был не файл 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 (там есть ошибки) я понял, что часть звука пропала. В журналах (к счастью, есть утилита восстановления видео) больше не было упоминания аудио по прошествии определенного времени. Я возьму это как есть ...

6

@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, который работал для меня. Большое спасибо за инициирование этой темы.

3

Если у вас последний дистрибутив Ubuntu, вы можете установить docker и запустить:

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

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

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

0

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

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

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

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

-2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .