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

Como posso verificar a integridade de um ficheiro de vídeo (avi, mpeg, mp4...)?

Este título pode ser um pouco enganador, por isso deixem-me explicar …

Estou a descarregar um ficheiro de vídeo … mpeg, avi - sendo um dos formatos populares. Agora, se estou a descarregá-lo, e o descarregamento se parte no meio do uhm … download, então, por exemplo, o Windows Media Player vai dar algum erro e recusar a sua reprodução (embora o ficheiro esteja, digamos, 98% completo). Mas, leitores como KMPlayer, ou MediaPlayer Classic irão reproduzi-lo até esse ponto (por acaso, também o podem reproduzir enquanto está a ser descarregado).

Então, estou interessado, … sem utilizar qualquer meio de download (gestores de download e afins) para garantir que o ficheiro é completamente descarregado, como se pode verificar se o ficheiro de vídeo é descarregado inteiro, e se está completo ?

回答 (7)

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

Pode utilizar uma funcionalidade no conversor de vídeo ffmpeg: se o especificar para recodificar vídeo a nada, apenas lerá o ficheiro de entrada e relatará quaisquer erros que apareçam. Este processo é muito rápido porque os quadros de vídeo estão apenas a ser lidos, verificados e silenciosamente largados.

Exemplo de linha de comando: (para Linux)

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

-v error significa um certo nível de verbosidade (para mostrar alguns erros que normalmente estão escondidos porque não afectam muito a jogabilidade).

Obterá um registo de erros completo com alguma informação genérica sobre o ficheiro ffmpeg que sairá, pelo que isto irá provavelmente requerer a sua atenção, através de filtros que podem ser escritos para efectuar a verificação de lotes de ficheiros semelhantes.

FFmpeg também está disponível para Windows aqui . A linha de comando será quase idêntica, com excepção do redireccionamento stderr:

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

Gostei da ideia de usar o ffmpeg -f null acima, mas na verdade gostaria de automatizar o processo de utilização dessa saída. Em particular, o cenário comum que tenho com a minha colecção de vídeos musicais é que tenho poucos clipes com a mesma resolução, e gostaria de difundir registos de verificação desses ficheiros para remover os mais partidos.

Infelizmente, o ffmpeg até agora não tem uma forma de desactivar o seu modo interactivo, o que produz ruído para este caso de utilização. Acabei por invadir um simples script de invólucro para fazer a filtragem:

#!/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

Exemplo de saída:

[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

Para windows, pode ‘batch’ verificar a integridade dos vídeos na pasta actual e em todas as subpastas com este ficheiro 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]

Se não der um filtro, receberá ‘*.mp4’.

Amostras: checkvideo.batcheckvideo.bat *.avi

Configuração: Descarregar FFmpeg para Windows a partir daqui: https://ffmpeg.zeranoe.com/builds/ e descompacte-os Altere `C:\ffmpeg\binPara windows, pode ‘batch’ verificar a integridade dos vídeos na pasta actual e em todas as subpastas com este ficheiro 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]

Se não der um filtro, receberá ‘*.mp4’.

Amostras: checkvideo.batcheckvideo.bat *.avi

Configuração: Descarregar FFmpeg para Windows a partir daqui: [ https://ffmpeg.zeranoe.com/builds/ ]0x3& e descompacte-os Altere no ficheiro do taco para o caminho onde descompactou ffmpeg Coloque checkvideo.bat numa pasta incluída no Path ou adicione a sua pasta à variável de ambiente 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();

Referência: 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

Versão mais fácil

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

Isto imprimirá o nome do ficheiro à medida que estão a ser processados.

error.log conterá os erros.

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

O MediaInfo ](http://mediainfo.sourceforge.net/) é uma óptima ferramenta para obter informações sobre qualquer ficheiro de vídeo que lhe queira atirar. Isto pode ser capaz de destacar a informação que deseja.

Outra ferramenta é GSpot mas não é actualizada desde 2007.

Tente dar a cada um um ficheiro conhecido bom e conhecido mau e compare os resultados.

Eu costumava usar o GSpot até deixar de ser actualizado, depois mudei para MediaInfo

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

A questão com a outra resposta usando ffmpeg para recodificar para o formato null é que leva realmente muito tempo. Especialmente, se quiser verificar vários ficheiros num directório.

Uma forma rápida seria gerar miniaturas para todos os vídeos, e ver onde a geração de miniaturas falha.

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 revelou-se muito mais rápido do que outros métodos.

Contudo, existe um CAVEAT. Este método pode produzir resultados errados, porque por vezes podem ser geradas miniaturas mesmo para ficheiros corruptos. Por exemplo, se o ficheiro de vídeo for corrompido apenas no final, este método falhará.