2010-01-25 12:54:46 +0000 2010-01-25 12:54:46 +0000
130
130

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

Questo titolo potrebbe essere un po’ fuorviante, quindi lasciatemi spiegare …

Sto scaricando un file video … mpeg, avi - essendo uno dei formati popolari. Ora, se lo sto scaricando, e il download si interrompe nel mezzo del uhm … download, allora, per esempio, Windows Media Player darà qualche errore e si rifiuterà di riprodurlo (anche se il file è, diciamo, completo al 98%). Ma lettori come KMPlayer o MediaPlayer Classic lo riprodurranno fino a quel punto (in effetti, possono riprodurlo anche mentre viene scaricato).

Quindi, mi interessa, … senza usare alcun mezzo di download (download manager e simili) per assicurarsi che il file sia completamente scaricato, come si può verificare se il file video è stato scaricato intero, e che sia completo?

Risposte (7)

137
137
137
2010-01-25 13:05:22 +0000

Puoi usare una caratteristica del convertitore video ffmpeg: se lo specifichi per ricodificare il video in niente, leggerà semplicemente il file di input e riporterà tutti gli errori che appariranno. Questo è un processo molto veloce perché i fotogrammi video vengono solo letti, controllati e abbandonati silenziosamente.

Esempio di linea di comando: (per Linux)

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

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

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

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

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
14
14
14
2011-09-22 17:05:59 +0000

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 pochi clip che hanno la stessa risoluzione, e mi piacerebbe diffondere i log di verifica per quei file per rimuovere quelli più rotti.

Sfortunatamente, ffmpeg finora non ha un modo per disabilitare la sua modalità interattiva, che produce rumore in questo caso d'uso. Ho finito con l'hackerare un 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
1
1
1
2017-08-15 14:13:33 +0000

Per windows, puoi controllare in batch 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.batcheckvideo.bat *.avi

Impostazione: Scarica FFmpeg per Windows da qui: https://ffmpeg.zeranoe.com/builds/ e decomprimilo Cambia `C:\ffmpeg\binPer windows, puoi controllare in batch 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.batcheckvideo.bat *.avi

Impostazione: Scarica FFmpeg per Windows da qui: [ https://ffmpeg.zeranoe.com/builds/ ]0x3& e decomprimilo Cambia nel file bat per il percorso dove hai decompresso ffmpeg Metti checkvideo.bat in una cartella inclusa nel Path o aggiungi la sua cartella alla variabile d'ambiente Path

0
0
0
2020-01-12 11:14:29 +0000

fluent-ffmpeg

var ffmpeg = require('fluent-ffmpeg');
var ff = new ffmpeg();

ff.on('start', function(commandLine) {
  // on start, you can verify the command line to be used
})
.on('progress', function(data) {
  // do something with progress data if you like
})
.on('end', function() {
  // do something when complete
})
.on('error', function(err, stdout, stderr) {
  // handle error conditions
  console.log('Error: ' + err.message)
  console.log('ffmpeg output:\n' + stdout)
  console.log('ffmpeg stderr:\n' + stderr)
})
.addInput('path\to\file')
.addInputOption('-xerror')
.addInputOption('-v error')
.output('-')
.outputOptions('-f null')
.run();

Riferimento: https://stackoverflow.com/questions/43349360/how-to-check-for-corrupted-webm-video-using-node-js-and-fluent-ffmpeg

0
0
0
2019-11-12 09:31:47 +0000

Versione più semplice

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done

Questo stamperà il nome del file mentre viene elaborato.

error.log conterrà gli errori.

0
0
0
2010-01-25 13:13:15 +0000

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

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

Prova a dare a ciascuno un file noto buono e uno noto cattivo e confronta i risultati.

Io usavo GSpot finché non ha smesso di essere aggiornato, poi sono passato a MediaInfo

0
0
0
2018-04-11 12:16:24 +0000

Il problema con l'altra risposta che usa ffmpeg per ricodificare in formato null è che ci vuole davvero molto tempo. Specialmente se si vogliono controllare più file in una directory.

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

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 ATTENZIONE. Questo metodo può dare risultati sbagliati, perché a volte la miniatura può essere generata anche per file corrotti. Ad esempio, se il file video è corrotto solo alla fine, questo metodo fallirà.