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

100

Este título pode ser um pouco enganador, então deixe-me explicar ...

Estou baixando um arquivo de vídeo ... mpeg, avi - sendo um dos formatos mais populares. Agora, se eu estou baixando, e o download quebra no meio do uhm ... download, então, por exemplo, o Windows Media Player dá algum erro e se recusa a tocá-lo (embora o arquivo seja, digamos, 98% completo). Mas, jogadores como o KMPlayer, ou o MediaPlayer Classic vão jogar até esse ponto (de fato, eles podem tocá-lo enquanto ele está sendo baixado também).

Então, estou interessado, ... sem usar nenhum meio de download (gerenciadores de download e afins) para garantir que o arquivo seja baixado por completo, como é possível verificar se o arquivo de vídeo foi baixado inteiro e se está completo ?

    
por Rook 25.01.2010 / 13:54

5 respostas

107

Você pode usar um recurso em ffmpeg video converter: se você especificá-lo para recodificar vídeo em nada, ele apenas lerá o arquivo de entrada e informará os erros que aparecerão. Esse processo é muito rápido porque os quadros de vídeo estão sendo lidos, verificados e descartados silenciosamente.

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 ocultos porque não afetam a capacidade de reprodução um tanto).

Você obterá um log de erros completo com algumas informações genéricas sobre o arquivo que o ffmpeg exibirá, portanto, isso provavelmente exigirá sua atenção, por meio de filtros que podem ser gravados para executar a verificação em lote de arquivos semelhantes.

O FFmpeg também está disponível para o Windows aqui . A linha de comando será quase idêntica a uma exceção do redirecionamento stderr:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
    
por 25.01.2010 / 14:05
7

Gostei da ideia de usar ffmpeg -f null acima, mas gostaria de automatizar o processo de usar essa saída. Em particular, o cenário comum que tenho com minha coleção de videoclipes é que tenho alguns clipes com a mesma resolução e gostaria de diferenciar os logs de verificação desses arquivos para remover os que foram mais quebrados.

Infelizmente, o ffmpeg até agora não tem como desabilitar seu modo interativo, que gera ruído para este caso de uso. Eu acabei hackeando um simples script de wrapper para fazer 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
    
por 22.09.2011 / 19:05
0
O

MediaInfo é uma ótima ferramenta para obter informações sobre qualquer arquivo de vídeo que você queira lançar nele. Isso pode destacar as informações desejadas.

Outra ferramenta é o GSpot , mas ele não é atualizado desde 2007.

Tente dar a cada um deles um arquivo ruim conhecido e bom e compare os resultados.

Eu costumava usar o GSpot até que ele parasse de ser atualizado, então mudei para o MediaInfo

    
por 25.01.2010 / 14:13
0

Para janelas, você pode verificar a integridade dos vídeos na pasta atual e em todas as subpastas com este arquivo bat: 'batch':

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 você não der um filtro, receberá '* .mp4'.

Amostras:     %código%      checkvideo.bat

Configuração: Baixe o FFmpeg para Windows aqui: link e descompacte-os Altere checkvideo.bat *.avi no arquivo bat para o caminho onde você descompactou o ffmpeg Coloque C:\ffmpeg\bin\ em uma pasta incluída no caminho ou adicione sua pasta à variável de ambiente Path

    
por 15.08.2017 / 16:13
0

O problema com a outra resposta usando ffmpeg para recodificar para o formato null é que isso leva muito tempo. Especialmente, se você quiser verificar vários arquivos em um diretório.

Uma maneira rápida seria gerar miniaturas de 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 acabou por ser muito mais rápido do que outros métodos.

No entanto, existe uma CAVEAT. Este método pode produzir resultados errados, porque às vezes a miniatura pode ser gerada mesmo para arquivos corrompidos. Por exemplo. se o arquivo de vídeo estiver corrompido apenas no final, esse método falhará.

    
por 11.04.2018 / 14:16