¿Cómo abrir y reparar un archivo de video m4v o mp4?

59

Ayer estaba filmando una escena con mi teléfono, pero de repente la aplicación se bloqueó y cuando trato de abrir el m4v generado, dice que está dañado.

He descargado los archivos de video (alrededor de 36 MB) en mi PC y estoy tratando de abrirlos y repararlos. ¿Me puede sugerir una forma de hacerlo?

Información de FFMPEG

Como se sugiere en los comentarios, trato de verificar lo que FFMPEG me dice sobre ese archivo con este comando

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

Aquí está el resultado:

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

Las últimas dos líneas se muestran en rojo.

Pato
fuente
Mi sistema operativo es Windows 7, pero si es necesario, puedo preparar una máquina virtual con distribución basada en Linux.
Drake
@slhck Gracias por la ayuda, hice lo que sugirió y actualicé la pregunta.
Drake
77
Ah, eso es lo que esperaba. El átomo MOOV es un dato que se necesita para acceder a las transmisiones de video sin procesar dentro del contenedor MP4 / M4V. Hay muchas herramientas de "reparación de video" en línea, pero no confiaría en la mayoría de ellas. Sin embargo, puede darles una oportunidad, simplemente no pague nada. Lo que parece prometedor es Untrunk , que parece estar codificado para este problema exacto (es decir, un átomo MOOV faltante). O AtomicParsley . ¡Buena suerte!
slhck
1
¿Cómo reparo un mp4 roto con AtomicParsley?
chovy

Respuestas:

60

Es posible reparar el archivo mp4 o m4v roto usando Untrunc .

Para este método, necesita otro archivo de video del mismo dispositivo que no esté roto.

Cómo instalar untrunc

Para la compilación, necesita una instalación de Linux (idealmente Ubuntu) y la capacidad básica de usar una línea de comandos. También puede omitir esta parte y ejecutar a untrunctravés de Docker (consulte la respuesta a continuación ), si tiene eso.

Esto es lo que hay que hacer:

  1. Instale algunas bibliotecas de requisitos previos con este comando:

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

  2. Obtenga el código fuente de Untrunc del repositorio de GitHub (elija un método):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • o git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Compile el código fuente usando este comando (todas una línea):

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

    (puede intentar omitir este paso y usar el ejecutable listo para usar, pero no funcionó para mí)

  4. Entonces puedes arreglar el video. Necesita tanto el video roto como un video de trabajo de ejemplo.

Como arreglar el video

Encuentre otro video de trabajo, idealmente de la misma cámara y preferiblemente al menos tan largo como el roto; También la misma resolución si es posible (creo que esto puede ayudar, aunque no es esencial).

Ejecute este comando en la carpeta donde descomprimió y compiló Untrunc, pero reemplace los /path/to/...bits con sus 2 archivos de video:

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

Entonces debería desaparecer y, con suerte, producir un archivo reproducible llamado broken-video_fixed.m4v

¡Eso es todo!

VLC Media Player ahora debería poder reproducir el archivo. Sin embargo, puede estar informando la información de longitud incorrecta (Untrunc intenta adivinar / resolver esto, pero no siempre lo hace bien). Para solucionar este problema, vuelva a codificar el video a través de otro programa.

[Gracias al comentario de slhck por la sugerencia de probar Untrunc.]

[Muchas gracias a Federico Ponchio por codificar Untrunc en primer lugar, para resolver este problema exacto.]

gorrión
fuente
¡Genial, gracias por proporcionar las instrucciones completas aquí!
slhck
3
Gracias @Alex he actualizado el enlace. ¡Divertidamente, el Readme en github se basa en esta respuesta!
gorrión
1
Daría una solución basada en Windows. < superuser.com/questions/938185/recover-incomplete-video-files > ya que no tengo acceso a Internet en mis distribuciones de Linux.
RogUE
2
FWIW, esto no produjo videos reproducibles para mí, pero la ejecución de recovery_mp4_to_h264 a través de wine funcionó bien.
El compilador
1
Untrunc funcionó para mí, pero tuve que poner ambos archivos de video en el subdirectorio de la carpeta oculta .untrunc llamada untrunc-master. Luego, ejecute: ./untrunc goodfile.mp4 badfile.mp4 Un archivo de 2 gb tardó aproximadamente 3 minutos y solo tuve que volver a sincronizar el audio. Todo lo demás estuvo bien.
user8547
8

Si alguien más tropieza con esto, también probé el gorrión de la aplicación del que hablaba, pero no funcionó para mí (vea algunos informes de errores que creé en el repositorio de desarrolladores). Tal vez esto fue porque no era un archivo mp4 sino un archivo MOV ...

Lo que me ayudó fue esta publicación: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Se vinculan a un programa llamado "HD Video Repair Utility" ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), que es mucho más barato que Treasured ( http://aeroquartet.com/movierepair/repair ) . ¡Incluso señalaron que había una versión anterior (versión 1.5) que no costaba nada ( http://nagasoft.cn/download/videorepair1.5.zip )!

Intenté reparar el archivo con la versión 1.5 y lo conseguí en parte. Después de volver a codificar con ffmpeg (obtuve algunos errores allí), me di cuenta de que una parte del audio había desaparecido. En los registros (con mucho gusto la utilidad Video Repair Utility tiene algunos), no hubo más mención de audio después de un tiempo determinado. Lo tomaré como está ...

SimonSimCity
fuente
3
La URL de DROPBOX está muerta. alternativa encontrada: nagasoft.cn/download/videorepair1.5.zip
T.Todua
2
@ T.Todua, gracias por notificarme. Reemplacé el enlace de dropbox por el enlace que proporcionaste.
SimonSimCity
8

Puede instalar docker(disponible para todos los principales sistemas operativos) y ejecutar:

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

La sintaxis es para Bash en Linux o macOS. Aquí, GOOD-reference-file.MP4y BAD-corrupt-file.md5ambos deben estar en su directorio actual, y el directorio se montará /volen el contenedor Docker.

Lea los otros comentarios para obtener una explicación más detallada.

¡Esto fue lo más rápido para mí!

abourget
fuente
Gracias @slhck, Dockerfileestá disponible aquí si alguien quiere ver lo que se ejecutará antes de ejecutarlo en su computadora: github.com/synctree/docker-untrunc También hay un repositorio Dockerfilereal en este untruncmomento, no lo he probado ni comparado en detalle, pero menciónelo
gorrión
7

@sparrowt Sus instrucciones actuales no funcionaron en mi instalación reciente de Ubuntu 16.10. Recibí el siguiente error al compilar 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();

Como se explica en el repositorio no trunc , es posible que deba descargar libav por separado en lugar de utilizar la versión en el repositorio de Ubuntu. El siguiente código funcionó para mí:

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

Esto creó un archivo llamado broken-video_fixed.mp4 que funcionó para mí. Muchas gracias por iniciar este hilo.

Freeseek
fuente
1
¡Gracias! En la línea de compilación no ejecutada, tuve algunos errores en la línea de "referencia indefinida a 'BZ2_bzDecompressInit'", tuve que agregar -lbz2
Andrew Smart
No puede manejar archivos grandes. Solo se rinde.
Ken Sharp
¿Tu libav contiene un h264dec.h? porque track.cppestá tratando de incluirlo y no puedo encontrarlo en ningún lado: /
x29a
Esa dependencia se agregó con commit github.com/ponchio/untrunc/commit/… el 10 de octubre de 2017. Creo que ahora debe descargar libav-12.2 en lugar de libav-0.8.7
freeseek
Finalmente conseguí que esto funcione en Ubuntu 14.04.5 LTS. Tuvieron que correr sudo apt-get install yasm, sudo apt-get install libbz2-devy, para superar una referencia indefinida a 'clock_gettime', añadir -lrtal final de la g++línea de comandos (ver stackoverflow.com/a/2418175/550712 ). Convirtió aproximadamente 2/3 de mi video.
Mark Berry
2

En caso de que untrunc no sea compatible con el códec dentro de su archivo, puede intentar solucionarlo con un editor hexadecimal:

  1. obtuve otro archivo con el mismo formato, obtuve uno más grande pero probablemente cualquier longitud funcionará
  2. abrir ambos archivos en un editor hexadecimal
  3. reemplace la mdatsección en el archivo "ok" con la mdatsección en el archivo "roto", sin el encabezado (es decir, copie solo los bytes después de 'mdat')
  4. probablemente ya funcionaría así, si no, los 4 bytes antes de 'mdat' especifican el tamaño de la mdatsección, el valor actual será el tamaño anterior ( mdattamaño de la sección del archivo "ok" ), reemplácelo con el nuevo tamaño (" roto " mdattamaño de sección del archivo )

Terminé codificando un programa simple para hacerlo: https://github.com/golimarrrr/fix-3gp

Tanto el programa como a mano usando el editor hexadecimal deberían crear el mismo archivo fijo

golimar
fuente
-3

¿Has intentado abrir el archivo con VLC Player ? Por lo general, es bastante bueno para reparar archivos dañados.

Carlos Manta
fuente
8
Creo que esto puede aplicarse a los archivos AVI donde el índice puede incorporarse a la memoria, pero un archivo MP4 con un error de "átomo de moov no encontrado" durante el procesamiento de ffmpeg no reproduce nada en VLC.
Dom
2
VLC no puede reproducirlo también, en mi caso (archivo .mov)
rogerdpack