Come verificare se un video è stato scaricato completamente?


10

Ho un sacco di video che voglio controllare se sono completi o meno. Alcuni di essi possono essere scaricati parzialmente, ma non sono difettosi. Come posso verificare in modo efficiente se questi video sono stati scaricati completamente?

Se avessi i collegamenti, avrei verificato la loro dimensione, ma non lo faccio.

Ho provato a usare ffprobee mediainfo. ffprobesegnala problemi minori su file parzialmente scaricati, ma segnala anche problemi simili con alcuni file completamente scaricati. Devo usare ffmpegper leggere tutti i file e confrontare la lunghezza dei video per verificare se sono stati scaricati? C'è una soluzione migliore?


Stai parlando di file che sono attualmente in fase di download, ovvero il programma che li sta scaricando sta ancora scrivendo sul file mentre riceve più dati? O stai parlando di file il cui download è stato interrotto ad un certo punto in passato?
Gilles 'SO-smetti di essere malvagio' il

@Gilles I sono stati scaricati in passato e ora alcuni di questi file sono incompleti. Voglio trovare file video incompleti, in modo da poter trovare manualmente i collegamenti e riprendere il download.
Ho1,

@ Ho1 la mia risposta ha soddisfatto la tua domanda?
J363,

@ J363 Grazie per la risposta. Potresti per favore rispondere al mio commento?
Ho1,

Risposte:


11

ffmpegè uno strumento agnostico del sistema operativo in grado di determinare se un file video è stato scaricato completamente. Il comando seguente indica ffmpegdi leggere il video di input e di codificare il video nel nulla. Durante il processo di codifica, tutti gli errori come i frame mancanti vengono inviati a test.log.

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

Se un file video non viene scaricato completamente, ci saranno molte righe nel file test.log. Ad esempio, 0 MB mancante da un file video ha prodotto 71 righe di errori. Se il video è stato scaricato completamente e non è stato danneggiato, non vengono rilevati errori e non vengono stampate righe su test.log.


modificare

Nell'esempio che ho dato sopra, ho testato l'intero file perché il video di prova che ho scaricato era un torrent, che può avere blocchi mancanti in tutto il file.

L'aggiunta -sseof -60all'elenco di argomenti controllerà gli ultimi 60 secondi del file, che è notevolmente più veloce.

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

Avrai bisogno di una versione più recente di ffmpeg, 2.8 mancava il flag sseof, quindi ho usato 3.0.


1
Funziona in qualche modo, ma richiede l'elaborazione di tutto il video. Come metodo alternativo, ho scoperto che aprire il video in VLC, fare clic da qualche parte vicino alla fine richiede meno tempo ed è più pratico. È possibile definire una cosa simile in ffmpeg? Intendo cercare il 99% senza elaborare tutti i video e verificare se funziona correttamente senza errori.
Ho1,

@ Ho1 vedere il comando aggiornato.
J363,

1
Sono sicuro che il comando funzioni perché l'ho testato più volte con e senza il flag -sseof. Il comando originale controlla l'intero file, che è il comportamento suggerito. Il comando modificato richiesto richiede l'assunto che i dati mancano dalla fine del file nel comando, il che potrebbe non essere il caso. Il mio file di test è il 99,9% di un mp4 da 137 MB scaricato con un client torrent. Quando uso il flag -sseof e aumento progressivamente la quantità di tempo che guarda indietro, alla fine ottengo lo stesso output esatto come se avessi eseguito il comando cercando l'intero file.
J363,

1
Con -sse -sseof, ffmpeg legge ed elabora l'intero file. Quindi, comunque, aprire il video in VLC e fare clic verso la fine sarebbe più veloce.
Ho1,

1
Hai ragione, ma sto scaricando su http.
Ho1,

7

MediaInfo visualizza una riga:

Truncated: Yes

se un file non è completo come previsto dalle specifiche del formato.

Dal momento che tecnicamente non esiste alcuna differenza tra un file erroneamente (non conforme alle specifiche sui limiti dei file) i file combinati e parzialmente scaricati, è tecnicamente impossibile fare la differenza tra un file con errori e un file parzialmente scaricato.

Un altro test (avanzato) potrebbe essere fatto ad esempio leggendo l'indice di un file .mp4 e controllando che l'offset del file + la dimensione del fotogramma dell'ultimo fotogramma sia all'interno della dimensione del file che si ottiene, ma non è esattamente quello che si sta cercando per (se nel file sorgente sono presenti metadati, ad esempio poster, alla fine del file e il file viene troncato appena prima di questo poster, il download parziale non viene comunque rilevato in tutti i casi). Non è implementato in MediaInfo ma è possibile aggiungere una richiesta di funzionalità MediaInfo .

In tutti i casi, è molto difficile rilevare tutti i download parziali, poiché la dimensione totale del file non è indicata nella maggior parte dei formati di file video, quindi puoi essere sicuro che un file venga troncato, ma non puoi essere sicuro che un file non venga troncato. L'unico modo per essere sicuri di aver scaricato il file completo è quello di ottenere la dimensione del file da qualche altra parte (e meglio: avere il suo hash, ad esempio MD5).

PS: questa domanda non è specifica per nessun sistema operativo.


Grazie per la tua risposta. Non voglio una risposta esatta, una risposta approssimativa sarebbe sufficiente per me. Pensi che questa domanda dovrebbe essere spostata su superuser.com?
Ho1,

Non sono riuscito a ottenere questo campo nemmeno usando mediainfo versione v0.7.83 utilizzando -f(visualizzazione completa delle informazioni). Potresti aiutarmi per favore a ottenere Truncatedcampo?
Ho1,

Rimuovi solo 1 byte nel tuo file e dovresti visualizzare questo campo "troncato" (non è necessario -f, l'output predefinito è sufficiente). Cordiali saluti, è implementato per i formati più utilizzati oggi: MP4 / MOV, Matroska, MXF. stai testando con un altro formato?
Jérôme Martinez,

2
Grazie mille per la risposta. Per controllare più file contemporaneamente, ho usato quanto segue: mediainfo * | grep -E "^(IsTruncated|Complete name)"dove il nome file del file corrispondente viene visualizzato direttamente sopra la riga "IsTruncated: Sì".
0x01

4

Avevo un file in cui ffmpeg (v3.1.1) con -sseof -60 non mostrava alcun avvertimento e usciva senza alcuna indicazione che qualcosa non andava. Mediainfo non ha mostrato che il file è stato troncato. Solo tralasciando -sseof -60 segnalerebbe qualsiasi errore con ffmpeg. Quindi sono tornato a provare ffprobe. Sembrava leggermente più veloce di ffmpeg.

ffprobe -v error -count_frames -i filename.mp4

prodotto questo output

[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

Non ho ancora riscontrato falsi positivi (come riportato dall'OP).

Modifica : ffprobe era sui miei file di test circa il 10% più veloce di ffmpeg, ma solo se gli hai indicato di usare tutti i core con l'opzione '-threads 0'. Altrimenti usa solo un core / thread ed è più lento.


Questo non fornisce una risposta alla domanda. Una volta che hai una reputazione sufficiente , sarai in grado di commentare qualsiasi post ; fornire invece risposte che non richiedono chiarimenti da parte del richiedente . - Dalla recensione
Braiam,

@Braiam Risponde alla domanda, perché un file scaricato in modo completo non produrrà alcun output e un file incompleto lo farà.
Jan Ehrhardt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.