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

126

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 populares. Agora, se eu estiver baixando, e o download for interrompido no meio do uhm ... download, por exemplo, o Windows Media Player emitirá algum erro e se recusará a reproduzi-lo (embora o arquivo seja, digamos, 98% completo). Porém, jogadores como o KMPlayer ou o MediaPlayer Classic o reproduzirão até esse ponto (na verdade, eles poderão reproduzi-lo enquanto estiver sendo baixado também).

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

Torre
fonte
MPEG incompleto deve ser reproduzido sem problemas. O AVI possui índices para busca rápida no final do arquivo, que alguns jogadores usarão e outros não exigirão ou ignorarão.
bobince
7
Incomplete MPEG should play with no problems.@bince, a questão era / é como verificar se há corrupção, não como reproduzir um arquivo incompleto. Mesmo se um formato oferecer suporte à reprodução de arquivos incompletos, ainda será possível verificar se há corrupção se o arquivo não estiver em conformidade com as especificações de formato. Por exemplo, você ainda pode ler um arquivo de texto sem formatação incompleto, mas ainda pode detectar se o arquivo tem problemas, como se ele termina no meio de uma frase ou se há um monte de informações obviamente ausentes no meio.
Synetech

Respostas:

135

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

Exemplo de linha de comando: (para Linux)

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

-v errorsignifica um certo nível de verbosidade (para mostrar alguns erros que normalmente estão ocultos porque não afetam muito a jogabilidade).

Você obterá um log de erro completo com algumas informações genéricas sobre o arquivo ffmpeg, o que provavelmente exigirá sua atenção, através de filtros que podem ser escritos para executar a verificação em lote de arquivos semelhantes.

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

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
whitequark
fonte
5
A mesma velocidade como se estivesse convertendo.
Alguém
8
Outra opção é ffprobeque vem com o pacote ffmpeg. Ele não realiza nenhuma conversão, mas simplesmente lê as informações de metadados do arquivo. Portanto, ele detectará erros nos metadados, mas não encontrará problemas no próprio arquivo. Pessoalmente usando ffprobepara fazer a verificação rápida de carregado antes de processamento adicional
mente
11
Parece tomar sobre enquanto assistindo o filme, infelizmente, mas parece que ele funciona
MattPark
3
Se, como afirma o OP, "o download interrompe no meio do uhm ... download", é muito provável que todos os fluxos sejam interrompidos, para que você possa detectar esse erro restringindo a decodificação a apenas uma faixa de áudio (usando -map), o que acelerará significativamente a operação: ffmpeg -v error -i in.mkv -map 0:1 -f null …se houver um erro, ele registrará a posição do byte, que você pode usar para truncar o arquivo (um ou dois megabytes antes da segurança) e continuar o download.
Lumi
3
Demorou talvez 4 1/2 minutos para eu testar um arquivo .mkv de 1GB e 1 hora em um processador antigo de núcleo hexadecimal. Todos os núcleos foram maximizados durante o teste. Eu editei uma cópia do arquivo em hexadecimal e adicionei alguns blocos de 00 para simular danos. O log de erros relatou os erros corretamente. Os arquivos sem erros retornaram um error.log vazio
TripleAntigen 14/17
12

Eu gostei da ideia de usar ffmpeg -f nullacima, mas na verdade 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 poucos clipes com a mesma resolução e gostaria de diferenciar os registros de verificação desses arquivos para remover os que foram quebrados.

Infelizmente, o ffmpeg até agora não tem como desativar o modo interativo, o que gera ruído para este caso de uso. Acabei cortando um script de wrapper simples 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
pfalcon
fonte
11
se você fazê-lo assim que ele substitui peças com boas peças quebradas, que seria ainda melhor
akostadinov
Estou recebendo um erro ao usar este:
Akshit Rewari
2
Traceback (última chamada mais recente): Arquivo "F: \ filecheck.py", linha 6, em <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' .% sys.argv [1]) ler () IndexError: índice de lista de gama
Akshit Rewari
1

Para o Windows, você pode 'lote' verificar a integridade dos vídeos na pasta atual e em todas as subpastas com este arquivo 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

Usar:

checkvideo.bat [filter]

Se você não der um filtro, receberá '* .mp4'.

Amostras: checkvideo.bat checkvideo.bat *.avi

Instalação: Faça o download do FFmpeg para Windows a partir daqui: https://ffmpeg.zeranoe.com/builds/ e descompacte-o Altere C:\ffmpeg\bin\o arquivo bat do caminho em que você descompactou o ffmpeg Coloque checkvideo.batuma pasta incluída no caminho ou adicione sua pasta a Variável de ambiente do caminho

Juan Antonio Tubío
fonte
A resposta de Juan Antonio Tubío está trabalhando para eu verificar a integridade do vídeo. Mas como posso ler o arquivo de log e detectar a hora em que o vídeo está corrompido. Exemplo de log. [h264 @ 00000173649787c0] falha na decodificação de cabac do qscale diff em 64 7 [h264 @ 00000173649787c0] erro ao decodificar o MB 64 7, bytestream 38638
J.Duck
1

O problema com a outra resposta usada ffmpegpara recodificar no nullformato é que leva muito tempo. Especialmente, se você deseja verificar vários arquivos em um diretório.

Uma maneira 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;

Esse método acabou sendo muito mais rápido que outros métodos.

No entanto, há uma CAVEAT. Esse método pode gerar resultados incorretos, porque às vezes as miniaturas podem ser geradas mesmo para arquivos corrompidos. Por exemplo, se o arquivo de vídeo estiver corrompido apenas no final, esse método falhará.

shivams
fonte
0

O MediaInfo é uma ótima ferramenta para obter informações sobre qualquer arquivo de vídeo que você deseja lançar nele. Talvez seja possível destacar as informações que você deseja.

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

Tente fornecer a cada um um arquivo conhecido como bom e ruim e compare os resultados.

Eu costumava usar o GSpot até que ele deixasse de ser atualizado, depois mudei para o MediaInfo

Shevek
fonte
11
Eu tenho uma versão antiga do GSpot na minha máquina ... mas é uma ferramenta para algo completamente diferente (determinar o código / decodificar ...). Não tem nada a ver com isso. Vou verificar mediainfo.
Rook
O GSpot reportará se o tamanho do arquivo ou a contagem de quadros não correspondem ao esperado no índice (em algum lugar do lado esquerdo, já faz um tempo desde que eu o usei!), Também as versões posteriores adicionaram muita funcionalidade.
Shevek
O mediainfo pode verificar diretórios recursivamente: para obter um relatório de todos os arquivos em qualquer nível, começando na pasta atual, basta executar mediainfo *.
ccpizza
11
mediainfoaparentemente não verifica se está completo. Peguei um webmarquivo de vídeo de 33 MB e o coloquei truncatena metade. mediainfoainda tinha quase o mesmo resultado para ambos, nenhum sinal aparente de corrupção. Depois truncatede 1 MB, ainda não havia sinal claro de corrupção na saída. Somente se você analisasse mais profundamente a saída, haveria alguma informação contraditória. Mas essas partes dependem do formato do arquivo de vídeo, portanto você não pode automatizar essa detecção.
Tino
3
mediainfonão lê nada além de metadados. Isso não verificará a validade do seu arquivo de forma alguma.
precisa saber é o seguinte