Come posso verificare l'integrità di un file video (avi, mpeg, mp4 ...)?


126

Questo titolo potrebbe essere in qualche modo fuorviante, quindi lasciami spiegare ...

Sto scaricando un file video ... mpeg, avi - essendo uno dei formati più diffusi. Ora, se lo sto scaricando e il download si interrompe durante il download di uhm ..., ad esempio Windows Media Player emetterà un errore e rifiuterà di riprodurlo (anche se il file è, diciamo, 98% completato). Ma giocatori come KMPlayer o MediaPlayer Classic lo giocheranno fino a quel momento (di fatto, possono giocarci anche durante il download).

Quindi, sono interessato, ... senza utilizzare alcun mezzo di download (download manager e simili) per garantire che il file sia scaricato completamente, come si può verificare se il file video è scaricato intero e che è completo?


MPEG incompleto dovrebbe giocare senza problemi. AVI ha indici per la ricerca rapida alla fine del file, che alcuni giocatori useranno e alcuni non richiedono o ignoreranno.
bobince

7
Incomplete MPEG should play with no problems.@bobince, la domanda era / è come verificare la corruzione, non come riprodurre un file incompleto. Anche se un formato supporta la riproduzione di file incompleti, dovrebbe comunque essere possibile verificare la presenza di corruzione se il file non è conforme alle specifiche del formato. Ad esempio, puoi ancora leggere un file di testo semplice incompleto, ma puoi ancora rilevare se il file ha problemi come se si concluda nel mezzo di una frase o ci sia una porzione di informazioni ovviamente mancanti nel mezzo.
Synetech,

Risposte:


135

Puoi utilizzare una funzione nel ffmpegconvertitore video: se lo specifichi per ricodificare il video in nulla, leggerà semplicemente il file di input e segnalerà eventuali errori che verranno visualizzati. Questo è un processo molto veloce perché i fotogrammi video vengono appena letti, controllati e rilasciati silenziosamente.

Riga di comando di esempio: (per Linux)

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

-v errorsignifica un certo livello di verbosità (per mostrare alcuni errori che sono normalmente nascosti perché non influenzano molto la giocabilità).

Otterrai un registro degli errori completo con alcune informazioni generiche sul file che verrà generato da ffmpeg, quindi questo richiederà probabilmente la tua attenzione, attraverso i filtri possono essere scritti per eseguire il controllo batch di file simili.

FFmpeg è disponibile anche per Windows qui . La riga di comando sarà quasi identica ad eccezione del reindirizzamento stderr:

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

5
Stessa velocità di una conversione.
Qualcuno il

8
Un'altra opzione è ffprobequella fornita con il pacchetto ffmpeg. Non esegue alcuna conversione ma legge semplicemente le informazioni sui metadati dal file. Pertanto rileverà errori nei metadati ma non troverà alcun problema all'interno del file stesso. Uso personale ffprobeper effettuare una rapida verifica del caricamento prima di elaborarlo ulteriormente
mente,

1
Sembra durare fino a quando
guardiamo

3
Se, come afferma l'OP, "download si interrompe nel mezzo di uhm ... download", è molto probabile che tutti gli stream vengano interrotti, quindi puoi rilevare questo errore limitando la decodifica a una sola traccia audio (usando -map), che velocizzerà notevolmente l'operazione: ffmpeg -v error -i in.mkv -map 0:1 -f null …se si verifica un errore, registrerà la posizione del byte, che è possibile utilizzare per troncare il file (uno o due megabyte prima per sicurezza) e quindi riprendere il download.
Lumi,

3
Ho impiegato forse 4 1/2 minuti per testare un file .mkv da 1 GB e 1 ora di lunghezza, su un vecchio processore hex core. Tutti i core sono stati massimi durante il test. Ho modificato una copia del file e ho aggiunto alcuni blocchi di 00 per simulare il danno. Il registro errori ha riportato correttamente gli errori. I file senza errori hanno restituito un errore error.log
TripleAntigen

12

Mi piaceva l'idea di usare ffmpeg -f nullsopra, ma in realtà mi piacerebbe automatizzare il processo di utilizzo di quell'output. In particolare, lo scenario comune che ho con la mia raccolta di video musicali è che ho poche clip che hanno la stessa risoluzione e vorrei diffreggere i registri di verifica per quei file per rimuovere quelli più spezzati.

Sfortunatamente, ffmpeg finora non ha un modo per disabilitare la sua modalità interattiva, che emette rumore per questo caso di utilizzo. Ho finito per hackerare semplici script wrapper per fare il filtro:

#!/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

Esempio di output:

[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

1
se lo fai in modo che sostituisca le parti rotte con parti buone, sarebbe ancora meglio
Akostadinov

Ricevo un errore usando questo:
Akshit Rewari il

2
Traceback (ultima chiamata più recente): file "F: \ filecheck.py", riga 6, in <modulo> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: indice elenco fuori portata
Akshit Rewari

1

Per Windows, puoi 'batch' controllare l'integrità dei video nella cartella corrente e in tutte le sottocartelle con questo file 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

Uso:

checkvideo.bat [filter]

Se non dai un filtro, otterrai '* .mp4'.

Campioni: checkvideo.bat checkvideo.bat *.avi

Installazione: Scarica FFmpeg per Windows da qui: https://ffmpeg.zeranoe.com/builds/ e decomprimili Modifica C:\ffmpeg\bin\nel file bat per il percorso in cui hai decompresso ffmpeg Inserisci checkvideo.batuna cartella inclusa nel percorso o aggiungi la sua cartella a Variabile d'ambiente del percorso


La risposta di Juan Antonio Tubío sta lavorando per me per verificare l'integrità del video. Ma come posso leggere il file di registro e rilevare l'ora in cui il video è danneggiato. Esempio di registro. [h264 @ 00000173649787c0] decodifica cabac del Qscale diff non riuscita a 64 7 errore [h264 @ 00000173649787c0] durante la decodifica di MB 64 7, bytestream 38638
J.Duck

1

Il problema con l'altra risposta che usa ffmpegper ricodificare per nullformattare è che ci vuole davvero molto tempo. Soprattutto, se si desidera controllare più file in una directory.

Un modo rapido sarebbe quello di generare miniature per tutti i video e vedere dove fallisce la generazione delle miniature.

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;

Questo metodo si è rivelato molto più veloce di altri metodi.

Tuttavia, c'è un CAVEAT. Questo metodo può produrre risultati errati, perché a volte è possibile generare miniature anche per file corrotti. Ad esempio, se il file video è danneggiato solo alla fine, questo metodo fallirà.


0

MediaInfo è un ottimo strumento per ottenere informazioni su qualsiasi file video che ti interessa lanciarlo. Questo potrebbe essere in grado di evidenziare le informazioni desiderate.

Un altro strumento è GSpot ma non è stato aggiornato dal 2007.

Prova a dare a ognuno un file noto buono e noto e confronta i risultati.

Ho usato GSpot fino a quando non ha smesso di essere aggiornato, quindi sono passato a MediaInfo


1
Ho una vecchia versione di GSpot sulla mia macchina ... ma è uno strumento per qualcosa di completamente diverso (determinare il codice / decodifica ...). Non ha nulla a che fare con questo. Controllerò mediainfo.
Rook,

GSpot segnalerà se la dimensione del file o il conteggio dei frame non corrispondono a quelli previsti dall'indice (da qualche parte sul lato sinistro, è passato un po 'di tempo da quando l'ho usato!), Anche le versioni successive hanno aggiunto molte funzionalità.
Shevek,

mediainfo può eseguire una scansione ricorsiva delle directory: per ottenere un report di tutti i file a qualsiasi livello a partire dalla cartella corrente, è sufficiente eseguirlo mediainfo *.
ccpizza,

1
mediainfoapparentemente non verifica la completezza. Ho preso un webmfile video da 33 MB e l' truncateho dimezzato. mediainfoaveva ancora quasi lo stesso risultato per entrambi, nessun segno evidente di corruzione. Dopo un truncateing a 1 MB non c'era ancora alcun chiaro segno di corruzione nell'output. Solo se hai dato uno sguardo più approfondito all'output, c'erano alcune informazioni contraddittorie. Ma queste parti dipendono dal formato del file video, quindi non è possibile automatizzare questo rilevamento.
Tino,

3
mediainfonon legge altro che metadati. Questo non verificherà la validità del tuo file in alcun modo.
DanielSmedegaardBuus
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.