it-swarm.dev

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

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

Sto scaricando un file video ... mpeg, avi - essendo uno dei formati più diffusi. Ora, se lo sto scaricando e il download si interrompe nel bel mezzo del ... download, ad esempio, Windows Media Player emetterà un errore e si rifiuterà di riprodurlo (sebbene il file sia, diciamo, 98% completato). Ma giocatori come KMPlayer o MediaPlayer Classic lo riprodurranno fino a quel momento (dato che, in effetti, possono giocarlo mentre viene scaricato).

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

120
Rook

Puoi usare una funzione nel convertitore video ffmpeg: se lo specifichi per ricodificare il video su nulla, leggerà solo il file di input e segnalerà eventuali errori che appariranno. Questo processo è molto veloce perché i frame video sono appena stati letti, controllati e rilasciati silenziosamente.

Riga di comando di esempio: (per Linux)

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

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

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

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

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

Mi è piaciuta l'idea di usare ffmpeg -f null sopra, ma in realtà mi piacerebbe automatizzare il processo di utilizzo di quell'output. In particolare, lo scenario comune che ho con la mia collezione di video musicali è che ho poche clip con la stessa risoluzione e mi piacerebbe registrare i registri di verifica per quei file per rimuovere quelli più danneggiati.

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

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

Il problema con l'altra risposta che utilizza ffmpeg per ricodificare il formato null è che impiega 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 di 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 rispetto ad altri metodi.

Tuttavia, c'è un CAVEAT. Questo metodo può produrre risultati errati, perché a volte può essere generata una miniatura anche per file corrotti. Per esempio. se il file video è danneggiato solo alla fine, questo metodo fallirà.

1
shivams

Per Windows, puoi 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

Usa:

checkvideo.bat [filter]

Se non si fornisce un filtro, verrà visualizzato "* .mp4".

Esempi: checkvideo.batcheckvideo.bat *.avi

Setup: Scarica FFmpeg per Windows da qui: https://ffmpeg.zeranoe.com/builds/ e decomprimi Modifica C:\ffmpeg\bin\ nel file bat per il percorso in cui hai decompresso ffmpeg Inserisci checkvideo.bat su una cartella inclusa nel percorso o aggiungi la sua cartella alla variabile di ambiente Path

0

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

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

Prova a dare a ciascuno un file conosciuto buono e conosciuto e confronta i risultati.

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

0
Shevek