2009-05-21 16 views
8

Tengo un servidor con muchos archivos de video. Después de una restauración, noté que la suma de comprobación de un par de archivos cambió. Como no tengo suma de comprobación para todos los archivos, quería escribir un script para verificar la integridad del archivo. Es simple para archivos (tar t, unzip -t, rar t, etc.) o imágenes (convert image.jpg /tmp/test.png).¿Cómo puedo validar un archivo de video desde un script?

¿Qué opciones debo pasar a mplayer o vlc o cualquier otra herramienta de video en Linux para lograr el mismo efecto (es decir, validar el contenido del archivo sin tener que mirar todo el video)?

+0

¿Está dañado el video (no se reproducirá) si no tiene la misma suma de comprobación? ? Sólo curiosidad por qué lo necesitas para que pueda aprender. – johnny

+0

¿Cómo sospecha que los archivos se dañaron? Encontrar la "causa raíz" de tales problemas podría ser mejor tiempo invertido. Consulte mi respuesta a continuación para obtener más sugerencias sobre la validación del archivo. – slacy

+0

@johnny: hago una copia de seguridad de mi servidor en discos duros. Parece que uno de los discos duros de copia de seguridad tenía una falla. La suma de comprobación del archivo cambió cuando la restauré desde la copia de seguridad. No estoy seguro de por qué sucedió, pero creo que un error de 1 TB de datos es algo que puede suceder. –

Respuesta

1

Como mplayer tiene opciones para convert from one video format to another que podrían ser lo suficientemente buenas para una prueba de este tipo suponiendo que el mencoder devuelve un error si no puede decodificar el archivo de entrada (no lo he probado). Esto funcionaría similar a la prueba de imagen usted ha mencionado (convertir /tmp/test.png imagen.jpg)

+0

¿Qué opciones debo usar? –

+0

@Aaron Digulla El enlace que proporcioné arriba menciona "mencoder -ovc lavc -oac lavc -o ". Sin embargo, no estoy seguro si eso funciona con sus archivos de entrada. Puede que tengas que experimentar. – lothar

-1

le recomiendo que utilice sha1sum, una herramienta de línea de comandos que es probable que ya tiene (y si no, probablemente también tengas md5sum, lo cual estaría bien para este trabajo) ... Todo lo que necesitas hacer es comparar la stdout de sha1sum antes y después de la restauración ...

+1

Lo hago, ahora. Pero eso no me dice si el archivo ya está corrupto o no. –

5

Parece que lo que quieres hacer es:

mplayer -vo null -ao null input.file 

y luego analizar la salida y el valor de retorno para ver si en realidad podría jugar & decodificar la secuencia. Esto llevará algún tiempo (pero será más rápido que en tiempo real). Si quieres algo aún más rápido, aquí hay algunas sugerencias más:

Una cosa fácil va a ser para hacer una

mplayer -identify -vo null -ao null 

en el archivo, y luego analizar la salida y mirar el valor de retorno para algo que parece razonable.

Con respecto a las sumas de comprobación que son incorrectas, será difícil saber si esto es un problema para su reproductor multimedia o no (mplayer, vlc, totem, etc.). Un buen reproductor multimedia tolerará muchos errores de nivel de bit o byte con poco impacto en la reproducción resultante. Un reproductor multimedia muy estricto saldrá cuando vea códec mal formado o incorrecto & bytes de contenedor.

Para comprobar los bytes (contenedor) de envoltura, que podría hacer algo como

mencoder -ovc copy -oac copy input.file -o output.file 

El problema es que mencoder tendrá que crear un archivo .avi para la salida. Si sus entradas son .avi, entonces esto funcionará muy bien.

puede ejecutar una línea de comandos ffmpeg similares, así:

ffmpeg -acodec copy -vcodec copy input.file output.file 

Si los archivos son archivos .mp4, es posible que desee echar un vistazo a mp4box (http://www.videohelp.com/tools/mp4box) para hacer una tarea similar. Las herramientas matroska también son buenas para este tipo de cosas. (http://www.matroska.org/)

+1

Es posible que necesite agregar -benchmark a la línea de comando de mplayer, para permitir que vaya más rápido que en tiempo real. – rix0rrr

2

Si está trabajando con archivos MP4 es posible que desee echar un vistazo al proyecto mpeg4ip, específicamente las herramientas como mp4videoinfo o mp4info.Esto puede ser suficiente para satisfacer sus necesidades, y es muy rápido.

Desde la primera página:

  • mp4dump utilidad para volcar archivo MP4 meta-información en forma de texto
  • mp4trackdump utilidad para volcar la información de pistas de archivos MP4 en forma de texto
  • mp4info Utilidad para visualizar el resumen del archivo MP4
  • mp4videoinfo utilidad para volcar la información sobre archivos de vídeo MP4 rastrea
  • avidump utilidad para visualizar AVI resumen de archivo
  • yuvdump Utilidad para mostrar un archivo de vídeo en bruto en la pantalla
  • mpeg_ps_info utilidad para mostrar las corrientes en una flujo de programa MPEG o archivo VOB
  • mpeg_ps_extract Utilidad para extraer flujos elementales en un archivo de flujo de programa MPEG o VOB

Aquí es un ejemplo de salida de un MP4 tomada en mi Nokia N95:

manoa:Movies stu$ mp4info 20081017001.mp4 
mp4info version 1.5.0.1 
20081017001.mp4: 
Track Type Info 
1 video MPEG-4 Unknown Profile(4), 3.620 secs, 2700 kbps, 640x480 @ 23.480663 fps 
2 audio MPEG-4 AAC LC, 3.797 secs, 97 kbps, 48000 Hz 
manoa:Movies stu$ 
manoa:Movies stu$ 
manoa:Movies stu$ mp4videoinfo 20081017001.mp4 
mp4videoinfo version 1.5.0.1 
tracks 1 
mp4file 20081017001.mp4, track 1, samples 85, timescale 30000 
sampleId  1, size 24110 time 0(0) VOP-I 
sampleId  2, size 9306 time 4076(135) VOP-P 
sampleId  3, size 13071 time 5104(170) VOP-P 
... (a bunch more frames and a bit of info) ... 
sampleId  59, size 8702 time 64975(2165) VOP-P 
sampleId  60, size 8826 time 65980(2199) VOP-P 
sampleId  61, size 9819 time 66966(2232) GOV VOP-I 
sampleId  62, size 5591 time 67986(2266) VOP-P 
... (a bunch more frames and a bit of info) ... 
sampleId  83, size 10188 time 105546(3518) VOP-P 
sampleId  84, size 6533 time 106585(3552) VOP-P 
sampleId  85, size 6032 time 107601(3586) VOP-P 
manoa:Movies stu$ 
2

corto de ver todos los videos, no hay manera "perfecta" para hacer esto.

Los archivos de video son bastante robustos, como experimento tomé un archivo de video MPEG-4 al azar, lo abrí en un editor hexadecimal y comencé a cambiar los bytes .. mplayer y Quicktime todavía lo reproduje sin errores.

que tenía que eliminar miles de bytes antes de recibir cualquier error de mplayer:

... 
[mpeg4 @ 0x6762b0]marker does not match f_code 
[mpeg4 @ 0x6762b0]marker does not match f_code 
[mpeg4 @ 0x6762b0]concealing 852 DC, 852 AC, 852 MV errors 
[mpeg4 @ 0x6762b0]header damaged: 0.055 16/ 16 15% 1% 3.5% 0 0 
Error while decoding frame! 

No sería difícil escribir un script que se ejecuta mplayer en cada vídeo, y se comprueba la salida para mensajes de error/advertencias, pero a menos que los bytes modificados estén en el encabezado del archivo o se hayan cambiado muchos datos, nunca los encontrará todos

Cuestiones relacionadas