Como verificar se um vídeo foi completamente baixado?

6

Eu tenho um monte de vídeos que eu quero verificar se eles estão completos ou não. Alguns deles podem ser baixados parcialmente, mas não estão com defeito. Como posso verificar com eficiência se esses vídeos foram baixados por completo?

Se eu tivesse os links, teria verificado o tamanho deles, mas não o fiz.

Eu tentei usar ffprobe e mediainfo . ffprobe relata problemas menores em arquivos baixados parcialmente, mas também relata problemas semelhantes com alguns arquivos completamente baixados. Devo usar ffmpeg para ler os arquivos inteiros e comparar a duração dos vídeos para verificar se eles são baixados? Existe uma solução melhor?

    
por Ho1 12.03.2016 / 13:05

3 respostas

9

ffmpeg é uma ferramenta de agnóstico do SO que é capaz de determinar se um arquivo de vídeo foi completamente baixado. O comando abaixo instrui ffmpeg para ler o vídeo de entrada e codificar o vídeo para nada. Durante o processo de codificação, quaisquer erros, como quadros ausentes, são enviados para o test.log.

ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log

Se um arquivo de vídeo não for totalmente baixado, haverá muitas linhas no arquivo test.log. Por exemplo, 0,1 MB ausentes de um arquivo de vídeo produziram 71 linhas de erros. Se o vídeo tiver sido totalmente baixado e não tiver sido corrompido, nenhum erro será encontrado e nenhuma linha será impressa no test.log.

Editar

No exemplo que dei acima, testei o arquivo inteiro porque o vídeo de teste que baixei era um torrent, que pode ter partes faltantes em todo o arquivo.

Adicionar -sseof -60 à lista de argumentos verificará os últimos 60 segundos do arquivo, que é consideravelmente mais rápido.

ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log

Você precisará de uma versão mais nova do ffmpeg, o 2.8 não possui o sinalizador sseof, então usei o 3.0.

    
por 02.05.2016 / 14:10
6

MediaInfo exibe uma linha:

Truncated: Yes

se um arquivo não estiver completo conforme esperado pelas especificações de formato.

Como tecnicamente não há diferença entre um arquivo incorretamente (não atendendo às especificações sobre limites de arquivo) arquivos com muxos e parcialmente baixados, é tecnicamente impossível fazer a diferença entre um arquivo com bugs e um arquivo parcialmente baixado.

Outro teste (avançado) pode ser feito, e. lendo o índice de um arquivo .mp4 e verificando se o tamanho do arquivo offset + frame do último frame está dentro do tamanho do arquivo que você obtém, mas não é exatamente o que você está procurando (se houver metadados, por exemplo, o arquivo de origem, no final do arquivo, e o arquivo é truncado logo antes deste poster, o download parcial ainda não é detectado em todos os casos). Ele não está implementado no MediaInfo, mas você pode adicionar uma solicitação de recurso do MediaInfo .

Em todos os casos, é muito difícil detectar todos os downloads parciais, pois o tamanho total do arquivo não é indicado na maioria dos formatos de arquivo de vídeo, portanto você pode ter certeza de que o arquivo está truncado, mas não pode ter certeza de que um arquivo não está truncado. A única maneira de ter certeza de que você baixou o arquivo completo é obter o tamanho do arquivo de outro lugar (e melhor: ter seu hash, por exemplo, MD5).

PS: essa pergunta não é específica de nenhum sistema operacional.

    
por 13.03.2016 / 11:57
1

Eu tinha um arquivo onde o ffmpeg (v3.1.1) com -sseof -60 não mostrava nenhum aviso e apenas saía sem nenhuma indicação de que algo estava errado. Mediainfo não mostrou o arquivo foi truncado também. Apenas deixando de fora o -sseof -60 iria relatar qualquer erro com ffmpeg. Então voltei a tentar ffprobe. Parecia um pouco mais rápido que o ffmpeg.

ffprobe -v error -count_frames -i filename.mp4

produziu esta saída

[h264 @ 00000000004e6a60] Invalid NAL unit size.
[h264 @ 00000000004e6a60] Error splitting the input into NAL units.
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004e5280] stream 1, offset 0x1350135: partial file

Ainda não encontrei nenhum falso positivo (conforme relatado pelo OP).

Editar : ffprobe estava nos meus arquivos de teste cerca de 10% mais rápido que o ffmpeg, mas apenas se você instruí-lo para usar todos os núcleos com a opção '-threads 0'. Caso contrário, ele usa apenas um núcleo / thread e é mais lento.

    
por 30.07.2016 / 18:29