¿Cómo puedo verificar la integridad de un archivo de video (avi, mpeg, mp4 ...)?


126

Este título podría ser algo engañoso, así que déjame explicarte ...

Estoy descargando un archivo de video ... mpeg, avi, siendo uno de los formatos más populares. Ahora, si lo estoy descargando, y la descarga se interrumpe en el medio de la descarga uhm ..., entonces, por ejemplo, Windows Media Player emitirá algún error y se negará a reproducirlo (aunque el archivo es, digamos, 98% completo). Pero jugadores como KMPlayer o MediaPlayer Classic lo jugarán hasta ese momento (de hecho, también pueden jugarlo mientras se está descargando).

Entonces, estoy interesado, ... sin usar ningún medio de descarga (gestores de descargas y similares) para asegurar que el archivo se descargue por completo, ¿cómo se puede verificar si el archivo de video se descargó completo y si está completo?


El MPEG incompleto debería jugar sin problemas. AVI tiene índices para búsqueda rápida al final del archivo, que algunos jugadores usarán y otros no requerirán o ignorarán.
bobince

77
Incomplete MPEG should play with no problems.@bobince, la pregunta era / es cómo verificar si hay corrupción, no cómo reproducir un archivo incompleto. Incluso si un formato admite la reproducción de archivos incompletos, aún debería ser posible verificar si el archivo no cumple con las especificaciones del formato. Por ejemplo, aún puede leer un archivo de texto plano incompleto, pero aún puede detectar si el archivo tiene problemas como si termina en el medio de una oración o si hay un fragmento de información que obviamente falta en el medio.
Synetech

Respuestas:


135

Puede usar una función en el ffmpegconvertidor de video: si lo especifica para recodificar el video a nada, solo leerá el archivo de entrada e informará cualquier error que aparezca. Este es un proceso muy rápido porque los cuadros de video se están leyendo, verificando y descartando en silencio.

Ejemplo de línea de comando: (para Linux)

ffmpeg -v error -i file.avi -f null - 2>error.log

-v errorsignifica un cierto nivel de verbosidad (para mostrar algunos errores que normalmente están ocultos porque no afectan mucho la jugabilidad).

Obtendrá un registro de errores completo con información genérica sobre el archivo ffmpeg que se generará, por lo que esto probablemente requerirá su atención, ya que se pueden escribir filtros para realizar una verificación por lotes de archivos similares.

FFmpeg también está disponible para Windows aquí . La línea de comando será casi idéntica con la excepción de redirección stderr:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1

55
Misma velocidad que si se estuviera convirtiendo.
Alguien

8
Otra opción es ffprobeque viene en paquete con ffmpeg. No realiza ninguna conversión, sino que simplemente lee la información de metadatos del archivo. Por lo tanto, detectará errores en los metadatos pero no encontrará ningún problema dentro del archivo. Uso personal ffprobepara hacer una verificación rápida de los archivos cargados antes de seguir procesando
mente

1
Parece que lleva tanto tiempo como ver la película desafortunadamente, pero parece que funciona
MattPark

3
Si, como dice el OP, "la descarga se interrumpe en el medio de la descarga uhm ...", es muy probable que todas las transmisiones se interrumpan, por lo que puede detectar este error al restringir la decodificación a una sola pista de audio (usando -map), lo que acelerará significativamente la operación: ffmpeg -v error -i in.mkv -map 0:1 -f null …si hay un error, registrará la posición del byte, que puede usar para truncar el archivo (un megabyte o dos antes para estar seguro) y luego reanudará la descarga.
Lumi

3
Me llevó unos 4 1/2 minutos probar un archivo .mkv de 1 GB de 1 hora de duración en un procesador hexadecimal de núcleo antiguo. Todos los núcleos fueron maximizados durante la prueba. He editado una copia del archivo hexadecimal y agregué algunos bloques de 00 para simular daños. El registro de errores informó los errores correctamente. Los archivos sin errores devolvieron un error.log vacío
TripleAntigen

12

Me gustó la idea de usar ffmpeg -f nullarriba, pero en realidad me gustaría automatizar el proceso de usar esa salida. En particular, el escenario común que tengo con mi colección de videos musicales es que tengo pocos clips que tienen la misma resolución, y me gustaría diferenciar los registros de verificación de esos archivos para eliminar los que están más rotos.

Desafortunadamente, ffmpeg hasta ahora no tiene una forma de desactivar su modo interactivo, que genera ruido para este caso de uso. Terminé hackeando un script de contenedor simple para hacer el filtrado:

#!/usr/bin/env python
import sys
import os
import re

t = os.popen('ffmpeg -v 5 -i "%s" -f null - 2>&1' % sys.argv[1]).read()
t = re.sub(r"frame=.+?\r", "", t)
t = re.sub(r"\[(.+?) @ 0x.+?\]", "[\\1]", t)
print t

Salida de ejemplo:

[mpeg1video]ac-tex damaged at 21 17
[mpeg1video]Warning MVs not available
[mpeg1video]concealing 22 DC, 22 AC, 22 MV errors
[mpeg1video]Warning MVs not available
[mpeg1video]concealing 22 DC, 22 AC, 22 MV errors
[mpeg1video]ac-tex damaged at 13 9

1
si lo haces para que reemplace las piezas con buenas piezas rotas, que sería aún mejor
akostadinov

Recibo un error al usar esto:
Akshit Rewari

2
Rastreo (última llamada más reciente): archivo "F: \ filecheck.py", línea 6, en <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: índice de lista fuera de rango
Akshit Rewari

1

Para Windows, puede verificar la integridad por lotes de los videos en la carpeta actual y todas las subcarpetas con este archivo bat:

checkvideo.bat

@echo off

set "filtro=%1"
if [%filtro%]==[] (
    set "filtro=*.mp4"
    )

for /R %%a in (%filtro%) do call :doWork "%%a"

    PAUSE
    exit /B

:doWork
    C:\ffmpeg\bin\ffmpeg.exe -v error -i %1 -f null - > "%~1.log" 2>&1

Utilizar:

checkvideo.bat [filter]

Si no le da un filtro, obtendrá '* .mp4'.

Muestras: checkvideo.bat checkvideo.bat *.avi

Configuración: descargue FFmpeg para Windows desde aquí: https://ffmpeg.zeranoe.com/builds/ y descomprímalos. Cambie C:\ffmpeg\bin\en el archivo bat de la ruta donde ha descomprimido ffmpeg. Coloque checkvideo.batuna carpeta incluida en la Ruta o agregue su carpeta a Variable de entorno de ruta


La respuesta de Juan Antonio Tubío está funcionando para mí para verificar la integridad del video. Pero, ¿cómo puedo leer el archivo de registro y detectar el tiempo en que el video está dañado? Ejemplo de registro [h264 @ 00000173649787c0] error de decodificación cabac de qscale diff en 64 7 [h264 @ 00000173649787c0] error al decodificar MB 64 7, bytestream 38638
J.Duck

1

El problema con la otra respuesta que se usa ffmpegpara recodificar el nullformato es que lleva realmente mucho tiempo. Especialmente, si desea verificar múltiples archivos en un directorio.

Una forma rápida sería generar miniaturas para todos los videos y ver dónde falla la generación de miniaturas.

find . -iname "*.mp4" | while read -r line; do 
  line=`echo "$line" | sed -r 's/^\W+//g'`; 
  echo 'HERE IT IS ==>' "$line"; 
  if ffmpeg -i "$line" -t 2 -r 0.5 %d.jpg; 
    then echo "DONE for" "$line"; 
  else echo "FAILED for" "$line" >>error.log; 
  fi; 
done;

Este método resultó ser mucho MÁS RÁPIDO que otros métodos.

Sin embargo, hay un CAVEAT. Este método puede arrojar resultados incorrectos, porque a veces se pueden generar imágenes en miniatura incluso para archivos corruptos. Por ejemplo, si el archivo de video está dañado solo al final, este método fallará.


0

MediaInfo es una gran herramienta para obtener información sobre cualquier archivo de video que desee lanzar. Esto puede resaltar la información que desea.

Otra herramienta es GSpot, pero no se ha actualizado desde 2007.

Intente dar a cada uno un archivo conocido bueno y otro malo conocido y compare los resultados.

Solía ​​usar GSpot hasta que dejó de actualizarse, luego cambié a MediaInfo


1
Tengo una versión antigua de GSpot en mi máquina ... pero es una herramienta para algo completamente diferente (determinar el código / decodificación ...). No tiene nada que ver con esto. Echaré un vistazo a mediainfo.
Torre

GSpot informará si el tamaño del archivo o el recuento de cuadros no coinciden con lo esperado del índice (en algún lugar del lado izquierdo, ¡ha pasado un tiempo desde que lo usé!), También las versiones posteriores agregaron mucha funcionalidad.
Shevek

mediainfo puede escanear directorios de forma recursiva: para obtener un informe de todos los archivos en cualquier nivel a partir de la carpeta actual, simplemente ejecute mediainfo *.
ccpizza

1
mediainfoaparentemente no verifica la integridad. Tomé un webmarchivo de video de 33 MB y lo truncatereduje a la mitad. mediainfotodavía tenía casi el mismo resultado para ambos, sin signos aparentes de corrupción. Después truncatede llegar a 1 MB todavía no había signos claros de corrupción en la salida. Solo si tenía una mirada más profunda a la salida, había alguna información contradictoria. Pero estas partes dependen del formato del archivo de video, por lo que no puede automatizar esta detección.
Tino

3
mediainfono lee nada más que metadatos. Esto no verificará la validez de su archivo de ninguna manera.
DanielSmedegaardBuus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.