2010-01-25 12:54:46 +0000 2010-01-25 12:54:46 +0000
130
130

¿Cómo puedo comprobar la integridad de un archivo de vídeo (avi, mpeg, mp4...)?

Este título podría ser algo engañoso, así que permítanme explicar …

Estoy descargando un archivo de vídeo … mpeg, avi - siendo uno de los formatos populares. Ahora, si lo estoy descargando, y la descarga se rompe en medio de la uhm … descarga, entonces, por ejemplo, Windows Media Player dará algún error y se negará a reproducirlo (aunque el archivo esté, digamos, 98% completo). Sin embargo, reproductores como KMPlayer o MediaPlayer Classic lo reproducirán hasta ese momento (de hecho, también pueden reproducirlo mientras se está descargando).

Entonces, me interesa, … sin utilizar ningún medio de descarga (gestores de descarga y similares) para asegurar que el archivo se descargue completamente, ¿cómo se puede verificar si el archivo de vídeo se descarga entero, y que está completo?

Respuestas (7)

137
137
137
2010-01-25 13:05:22 +0000

Puede utilizar una función del convertidor de vídeo ffmpeg: si le especifica que recodifique el vídeo a nada, sólo leerá el archivo de entrada e informará de cualquier error que aparezca. Este proceso es muy rápido porque los fotogramas de vídeo sólo se leen, se comprueban y se eliminan silenciosamente.

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

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

-v error significa un cierto nivel de verbosidad (para mostrar algunos errores que normalmente se ocultan porque no afectan mucho a la reproducción).

Obtendrá un registro de errores completo con alguna información genérica sobre el archivo que ffmpeg emitirá, por lo que esto probablemente requerirá su atención, a través de filtros pueden ser escritos para realizar la comprobación por lotes de archivos similares.

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

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
14
14
14
2011-09-22 17:05:59 +0000

Me gustó la idea de usar ffmpeg -f null arriba, 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 algunos clips que tienen la misma resolución, y me gustaría diferenciar los registros de verificación de esos archivos para eliminar los más rotos.

Desafortunadamente, ffmpeg no tiene hasta ahora una manera de desactivar su modo interactivo, que produce ruido para este caso de uso. Terminé hackeando un simple script wrapper 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

Ejemplo de salida:

[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
1
1
2017-08-15 14:13:33 +0000

En el caso de Windows, puede comprobar por lotes la integridad de los vídeos en la carpeta actual y en 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

Uso:

checkvideo.bat [filter]

Si no da un filtro, obtendrá ‘*.mp4’.

Muestras: checkvideo.batcheckvideo.bat *.avi

Instalación: Descargue FFmpeg para Windows desde aquí: https://ffmpeg.zeranoe.com/builds/ y descomprímalos Cambie `C:\ffmpeg\binEn el caso de Windows, puede comprobar por lotes la integridad de los vídeos en la carpeta actual y en 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

Uso:

checkvideo.bat [filter]

Si no da un filtro, obtendrá ‘*.mp4’.

Muestras: checkvideo.batcheckvideo.bat *.avi

Instalación: Descargue FFmpeg para Windows desde aquí: [ https://ffmpeg.zeranoe.com/builds/ ]0x3& y descomprímalos Cambie en el archivo bat por la ruta donde ha descomprimido ffmpeg Ponga checkvideo.bat en una carpeta incluida en la ruta o añada su carpeta a la variable de entorno Path

0
0
0
2020-01-12 11:14:29 +0000

fluent-ffmpeg

var ffmpeg = require('fluent-ffmpeg');
var ff = new ffmpeg();

ff.on('start', function(commandLine) {
  // on start, you can verify the command line to be used
})
.on('progress', function(data) {
  // do something with progress data if you like
})
.on('end', function() {
  // do something when complete
})
.on('error', function(err, stdout, stderr) {
  // handle error conditions
  console.log('Error: ' + err.message)
  console.log('ffmpeg output:\n' + stdout)
  console.log('ffmpeg stderr:\n' + stderr)
})
.addInput('path\to\file')
.addInputOption('-xerror')
.addInputOption('-v error')
.output('-')
.outputOptions('-f null')
.run();

Referencia: https://stackoverflow.com/questions/43349360/how-to-check-for-corrupted-webm-video-using-node-js-and-fluent-ffmpeg

0
0
0
2019-11-12 09:31:47 +0000

Versión más sencilla

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done

Esto imprimirá el nombre del archivo mientras se procesa.

error.log contendrá los errores.

0
0
0
2010-01-25 13:13:15 +0000

MediaInfo es una gran herramienta para obtener información sobre cualquier archivo de vídeo que se desee. Esto puede ser capaz de resaltar la información que desea.

Otra herramienta es GSpot pero no ha sido actualizada desde 2007.

Intenta darle a cada uno un archivo bueno y malo conocido y compara los resultados.

Yo solía usar GSpot hasta que dejó de actualizarse, entonces cambié a MediaInfo

0
0
0
2018-04-11 12:16:24 +0000

El problema con la otra respuesta que utiliza ffmpeg para recodificar al formato null es que tarda mucho tiempo. Especialmente, si quieres comprobar varios archivos en un directorio.

Una forma rápida sería generar miniaturas para todos los vídeos, 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 una ADVERTENCIA. Este método puede dar resultados erróneos, porque a veces se pueden generar miniaturas incluso para archivos corruptos. Por ejemplo, si el archivo de vídeo está dañado sólo al final, este método fallará.