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


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, eu estou interessado, ... sem usar qualquer meio de download (gerenciadores de download e similares) para proteger o arquivo é completamente baixado, como se pode verificar se o arquivo de vídeo é baixado todo, e que está completo?


98


origem


MPEG incompleto deve jogar sem problemas. AVI tem índices para busca rápida no final do arquivo, que alguns jogadores usarão e alguns não exigem ou irão ignorar. - bobince
Incomplete MPEG should play with no problems. @bobince, a questão era: como verificar se há corrupção, não como reproduzir um arquivo incompleto. Mesmo que um formato suporte a 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 é possível detectar se o arquivo tem problemas como se ele terminasse no meio de uma frase ou se houvesse uma parte da informação obviamente ausente no meio. - Synetech


Respostas:


Você pode usar um recurso em ffmpeg conversor de vídeo: se você especificá-lo para recodificar vídeo para 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 eles não afetam muito a capacidade de reprodução).

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

104



Mesma velocidade como se estivesse convertendo. - Somebody
Outra opção é ffprobe que vem em pacote com ffmpeg. Ele não faz nenhuma conversão, mas simplesmente lê informações de metadados do arquivo. Portanto, ele detectará erros nos metadados, mas não encontrará problemas no próprio arquivo. Pessoalmente usando ffprobe para fazer uma verificação rápida de upload antes de processar mais - mente
Parece demorar tanto quanto assistir o filme, infelizmente, mas parece que funciona - MattPark
Se, como o OP declara, "baixar quebras no meio do uhm ... download", é muito provável que todos os streams serão interrompidos, para que você possa detectar esse erro restringindo a decodificação apenas uma faixa de áudio (usando -map), que irá 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 megabyte ou dois antes para estar seguro) e, em seguida, continuar o download. - Lumi
Demorou talvez 4 1/2 minutos para eu testar um arquivo .mkv de uma hora e 1 GB, em um antigo processador de núcleo hexadecimal. Todos os núcleos foram maximizados durante o teste. Eu editei uma cópia do arquivo e adicionei alguns blocos de 00 para simular o dano. O log de erros relatou os erros corretamente. Arquivos sem erros retornaram um error.log vazio - TripleAntigen


Eu gostei da ideia de usar ffmpeg -f null acima, mas eu realmente 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 desativar seu modo interativo, que produz 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

7



se você fizer isso para substituir partes quebradas por partes boas, isso seria ainda melhor - akostadinov
Estou recebendo um erro usando isto: - Akshit Rewari
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]). read () IndexError: índice de lista fora do intervalo - Akshit Rewari


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 é GSpot mas não foi atualizado desde 2007.

Tente dar a cada um 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


0



Eu tenho uma versão antiga do GSpot na minha máquina ... mas é uma ferramenta para algo completamente diferente (determinar o código / decodificação ...). Não tem nada a ver com isso. Eu vou verificar mediainfo. - Rook
O GSpot irá reportar se o tamanho do arquivo ou a contagem de quadros não coincidirem com o esperado do índice (em algum lugar do lado esquerdo, já faz um tempo desde que eu usei!), Também versões posteriores adicionaram muita funcionalidade. - Shevek
mediainfo pode recursivamente scan diretórios: para obter um relatório de todos os arquivos em qualquer nível a partir da pasta atual simplesmente executar mediainfo *. - ccpizza
mediainfo aparentemente não verifica se está completo. Eu levei um 33 MB webm arquivo de vídeo e truncated para a metade. mediainfo ainda tinha quase a mesma saída para ambos, nenhum sinal aparente de corrupção. Depois de truncatecom 1 MB, ainda não havia sinais claros de corrupção na saída. Somente se você tivesse uma visão mais profunda da saída, havia algumas informações contraditórias. Mas essas partes dependem do formato do arquivo de vídeo, portanto você não pode automatizar essa detecção. - Tino
mediainfo não lê nada além de metadados. Isso não irá verificar a validade do seu arquivo de qualquer forma. - DanielSmedegaardBuus


Para janelas, você pode verificar a integridade dos vídeos na pasta atual e em todas as subpastas com esse 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

Configuração: Baixe o FFmpeg para Windows aqui: https://ffmpeg.zeranoe.com/builds/ e descompacte-os mudança C:\ffmpeg\bin\ no arquivo bat para o caminho onde você descompactou ffmpeg Colocar checkvideo.batem uma pasta incluída no caminho ou adicionar sua pasta à variável de ambiente Path


0



Juan Antonio TubíoA resposta está funcionando para eu verificar a integridade do vídeo. Mas como posso ler o arquivo de log e detectar o tempo em que o vídeo está corrompido? Exemplo de log. [h264 @ 00000173649787c0] O decodificador cabac de qscale diff falhou no erro 64 [h264 @ 00000173649787c0] ao decodificar MB 64 7, bytestream 38638 - J.Duck


O problema com a outra resposta usando ffmpeg recodificar para null formato é que demora 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 somente no final, esse método falhará.


0