Como verificar se um vídeo foi completamente baixado?

10

Tenho vários vídeos que quero verificar se 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 completamente baixados?

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

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

Ho1
fonte
Você está falando dos arquivos que estão sendo baixados no momento, ou seja, o programa que os está baixando ainda está gravando no arquivo à medida que recebe mais dados? Ou você está falando de arquivos cujo download foi abortado em algum momento no passado?
Gilles 'SO- stop be evil'
@ Gilles Os foram baixados no passado e agora alguns desses arquivos estão incompletos. Quero encontrar arquivos de vídeo incompletos, para poder encontrar manualmente os links e continuar o download.
• Ho1
@ Ho1 minha resposta satisfez sua pergunta?
J363 05/05
@ J363 Obrigado pela sua resposta. Você poderia responder meu comentário?
• Ho1

Respostas:

11

ffmpegé uma ferramenta independente de sistema operacional capaz de determinar se um arquivo de vídeo foi completamente baixado. O comando abaixo instrui ffmpega 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 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, .1 MB faltando em um arquivo de vídeo produziu 71 linhas de erros. Se o vídeo estiver 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 pedaços ausentes em todo o arquivo.

Adicionar -sseof -60à lista de argumentos verificará os últimos 60 segundos do arquivo, o 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 recente do ffmpeg, 2.8 faltando o sinalizador sseof, então usei o 3.0.

J363
fonte
1
Isso funciona de alguma forma, mas requer o processamento de todo o vídeo. Como método alternativo, descobri que abrir o vídeo no VLC, clicar em algum lugar próximo ao final leva menos tempo e é mais prático. É possível definir algo semelhante ffmpeg? Quero dizer, procurar 99% sem processar todo o vídeo e verificar se funciona bem sem erros.
• Ho1
@ Ho1 veja o comando atualizado.
J363 # 8/16
1
Tenho certeza de que o comando funciona porque testei várias vezes com e sem o sinalizador -sseof. O comando original verifica o arquivo inteiro, que é o comportamento sugerido. O comando alterado solicitado solicita a suposição de que faltam dados do final do arquivo no comando, o que pode não ser o caso. Meu arquivo de teste é 99,9% de um mp4 de 137MB baixado com um cliente torrent. Quando eu uso o sinalizador -sseof e aumenta progressivamente a quantidade de tempo que parece para trás, eu obtenho exatamente a mesma saída como se eu tivesse executado o comando pesquisando o arquivo inteiro.
J363 # 11/16
1
Com -sse -sseof, o ffmpeg lê e processa o arquivo inteiro. Enfim, abrir o vídeo no VLC e clicar perto do final seria mais rápido.
• Ho1
1
Você está certo, mas estou baixando por http.
• Ho1
7

MediaInfo exibe uma linha:

Truncated: Yes

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

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

Outro teste (avançado) pode ser feito, por exemplo, lendo o índice de um arquivo .mp4 e verificando se o deslocamento do arquivo + tamanho do último quadro está dentro do tamanho do arquivo que você obtém, mas não é exatamente o que você está procurando for (se houver metadados, por exemplo, pôsteres no arquivo de origem, no final do arquivo, e o arquivo for truncado imediatamente antes deste poster, o download parcial ainda não será detectado em todos os casos). 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, porque o tamanho total do arquivo não é indicado na maioria dos formatos de arquivo de vídeo, assim você pode ter certeza de que um arquivo está truncado, mas não pode ter certeza de que um arquivo não está truncado. A única maneira de garantir que você baixou o arquivo completo é obter o tamanho do arquivo em outro lugar (e melhor: ter seu hash, por exemplo, MD5).

PS: esta questão não é específica para nenhum sistema operacional.

Jérôme Martinez
fonte
Obrigado pela sua resposta. Eu não quero uma resposta exata, uma resposta aproximada seria suficiente para mim. Você acha que essa pergunta deve ser movida para superuser.com?
• Ho1
Não consegui obter esse campo, mesmo usando o mediainfo versão v0.7.83 usando -f(exibição de informações completas). Poderia ajudar na obtenção de Truncatedcampo?
• Ho1
Apenas remova 1 byte no seu arquivo e você deverá exibir esse campo "truncado" (não há necessidade de -f, a saída padrão é suficiente). FYI é implementado para os formatos mais utilizados atualmente: MP4 / MOV, Matroska, MXF. você está testando com outro formato?
Jérôme Martinez
2
Muito obrigado pela resposta. Para verificar muitos arquivos de uma vez, usei o seguinte: mediainfo * | grep -E "^(IsTruncated|Complete name)"onde o nome do arquivo correspondente está sendo exibido diretamente acima da linha "IsTruncated: Yes".
0x01
4

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

ffprobe -v error -count_frames -i filename.mp4

produziu essa 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).

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

Jan Ehrhardt
fonte
Isso não fornece uma resposta para a pergunta. Depois de ter reputação suficiente, você poderá comentar qualquer postagem ; em vez disso, forneça respostas que não exijam esclarecimentos do solicitante . - Do comentário
Braiam
@Braiam Ele responde à pergunta, porque um arquivo baixado de forma compelida não produzirá saída e um arquivo incompleto.
Jan Ehrhardt