Вопрос или проблема
Вчера я снимал сцену на телефон, но вдруг приложение вылетело, и когда я пытаюсь открыть сгенерированный 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
Последние две строки отображаются красным.
Вы можете восстановить поврежденный mp4 или m4v файл с помощью Untrunc.
Для этого метода вам нужен другой видеофайл с того же устройства, который не поврежден.
Как установить untrunc
Для компиляции вам потребуется установка Linux (идеально Ubuntu) и базовые навыки работы с командной строкой. Вы также можете пропустить эту часть и запустить untrunc
через Docker (см. ответ ниже), если у вас это есть.
Вот что нужно сделать:
-
Установите некоторые предварительные библиотеки с помощью этой команды:
sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev
-
Получите исходный код для 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
-
Скомпилируйте исходный код, используя эту команду (все в одну строку):
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil
(вы можете попробовать пропустить этот шаг и использовать готовый исполняемый файл, но у меня это не сработало)
-
Затем вы можете действительно исправить видео. Вам нужно как поврежденное видео, так и образец рабочей записи.
Как исправить видео
Найдите другой рабочий видеофайл, идеальным будет файл с той же камеры и, желательно, как минимум такой же длины, а также с тем же разрешением, если это возможно (я думаю, это может помочь, хотя и не обязательно).
Запустите эту команду в папке, где вы распаковали и скомпилировали 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, чтобы решить эту конкретную проблему.]
Вы можете установить 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.
Читайте другие комментарии для более подробного объяснения.
Это было для меня самым быстрым способом!
Если кто-то еще наткнется на это, я также пробовал приложение, о котором говорил sparrowt, но оно не сработало для меня (смотрите некоторые отчеты об ошибках, которые я создал в репозитории разработчиков). Возможно, это было потому, что это не был файл 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 есть логи) больше не упоминалось аудио после определенного времени. Я приму это как есть …
@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, который сработал для меня. Большое спасибо за то, что начали эту тему.
Если untrunc не поддерживает кодек в вашем файле, вы можете попробовать исправить его с помощью шестнадцатеричного редактора:
- получите другой файл с тем же форматом, у меня был больший, но, вероятно, подойдет любой размер
- откройте оба файла в шестнадцатеричном редакторе
- замените секцию
mdat
в “хорошем” файле на секциюmdat
в “поврежденном” файле, без заголовка (т.е. копируйте только байты после ‘mdat’) - возможно, это уже сработает, если нет, то 4 байта перед ‘mdat’ указывают размер секции
mdat
, текущее значение будет старым размером (размер секцииmdat
“хорошего” файла), замените его на новый размер (размер секцииmdat
“поврежденного” файла)
В итоге я написал простую программу для этого: https://github.com/golimarrrr/fix-3gp
И программа, и ручное исправление с помощью шестнадцатеричного редактора должны создать один и тот же исправленный файл
Вы пробовали открыть файл с помощью VLC Player? Обычно он достаточно хорошо справляется с восстановлением поврежденных файлов.
Ответ или решение
Как открыть и восстановить поврежденный файл видео формата m4v или mp4?
Если вы столкнулись с проблемой при попытке открыть видеофайл, сгенерированный вашим телефоном, и получили сообщение о том, что файл поврежден, не отчаивайтесь. Существуют способы восстановить такие файлы. В этом руководстве мы рассмотрим несколько методов, включая использование программного обеспечения и командной строки.
Анализ состояния файла с помощью FFMPEG
Первым шагом следует проанализировать поврежденный файл с помощью FFMPEG. Этот инструмент позволит вам получить информацию о проблемах с файлом. Используйте следующую команду:
ffmpeg -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt
На основании вашего вывода FFMPEG, вы заметили сообщение, что не был найден атом "moov". Это может означать, что файл может быть восстановлен.
Метод 1: Использование Untrunc
Одним из самых эффективных способов восстановления поврежденных видеофайлов является приложение Untrunc. Для его работы вам понадобится другой видеофайл, снятый на том же устройстве, который не поврежден. Вот как это сделать:
Установка Untrunc
Для установки Untrunc вам понадобится Linux, предпочтительно Ubuntu. Вы также можете использовать Docker для установки. Вот шаги для установки через терминал:
-
Установите необходимые библиотеки:
sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev
-
Скачайте исходный код Untrunc:
git clone https://github.com/ponchio/untrunc.git cd untrunc
-
Скомпилируйте исходный код:
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil
Процесс восстановления видео
После установки Untrunc, используйте следующий синтаксис команды для восстановления:
./untrunc /path/to/working-video.m4v /path/to/broken-video.m4v
После выполнения этой команды должен появиться новый файл, который, скорее всего, будет воспроизводим с помощью VLC или другого медиаплеера.
Метод 2: Восстановление с помощью hex-редактора
Если Untrunc не сработал, можно попробовать вручную исправить файл с помощью hex-редактора:
- Получите файл с тем же форматом и аналогичной длиной.
- Откройте оба файла в hex-редакторе.
- Скопируйте раздел
mdat
исправного файла, исключая заголовки, и замените соответствующий раздел в поврежденном файле. - Обновите 4 байта перед
mdat
, чтобы указать новый размер секции.
Метод 3: Программное обеспечение для восстановления видео
Если предыдущие методы не помогли, вы можете воспользоваться некоторыми специализированными программами, например:
Эти инструменты могут предложить автоматизированный процесс восстановления видео.
Итог
Хотя повреждение видеофайлов может быть неприятным, с помощью вышеперечисленных методов вы имеете все шансы на успешное восстановление вашего содержимого. Рекомендуется регулярно делать резервные копии файлов, чтобы уменьшить последствия неожиданного повреждения данных в будущем. Если у вас остались вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться к специалистам по восстановлению данных или к техническим сообществам.