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

Jak mogę sprawdzić integralność pliku wideo (avi, mpeg, mp4...)?

Ten tytuł może być nieco mylący, więc pozwólcie, że wyjaśnię…

Pobieram plik wideo … mpeg, avi - to jedne z popularnych formatów. Teraz, jeśli pobieram plik, a pobieranie zostanie przerwane w środku … pobierania, wtedy, na przykład, Windows Media Player poda jakiś błąd i odmówi odtwarzania (mimo, że plik jest, powiedzmy, w 98% kompletny). Ale odtwarzacze takie jak KMPlayer, czy MediaPlayer Classic odtworzą go do tego momentu (w rzeczywistości mogą go odtworzyć również w trakcie ściągania).

Interesuje mnie więc, … nie używając żadnych środków do pobierania (menadżerów pobierania i tym podobnych), aby zapewnić, że plik jest całkowicie pobrany, jak można sprawdzić, czy plik wideo został pobrany w całości, i czy jest kompletny ?

Odpowiedzi (7)

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

Możesz użyć funkcji w ffmpeg konwerter wideo: jeśli określisz go do rekodowania wideo do niczego, będzie po prostu przeczytać plik wejściowy i zgłosić wszelkie błędy, które pojawią się. Jest to bardzo szybki proces, ponieważ klatki wideo są po prostu czytane, sprawdzane i cicho zrzucane.

Przykładowa linia poleceń: (dla Linuksa)

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

-v error oznacza pewien poziom szczegółowości (aby pokazać niektóre błędy, które normalnie są ukryte, ponieważ nie mają większego wpływu na odtwarzanie).

Dostaniesz pełny log błędów z kilkoma ogólnymi informacjami o plikach, które ffmpeg wyrzuci, więc to prawdopodobnie będzie wymagało twojej uwagi, poprzez filtry, które mogą być napisane, aby wykonać wsadowe sprawdzanie podobnych plików.

FFmpeg jest również dostępny dla Windows tutaj . Linia poleceń będzie prawie identyczna z wyjątkiem przekierowania stderr:

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

Podobał mi się pomysł użycia ffmpeg -f null powyżej, ale chciałbym zautomatyzować proces używania tego wyjścia. W szczególności, częstym scenariuszem, jaki mam z moją kolekcją teledysków jest to, że mam kilka klipów, które mają taką samą rozdzielczość, i chciałbym rozróżnić logi weryfikacyjne dla tych plików, aby usunąć te najbardziej uszkodzone.

Niestety, ffmpeg jak dotąd nie ma sposobu na wyłączenie trybu interaktywnego, który generuje hałas w tym przypadku użycia. Skończyło się na zhakowaniu prostego skryptu wrappera do filtrowania:

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

Przykładowe wyjście:

[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

Dla Windows, możesz ‘wsadowo’ sprawdzić integralność filmów w bieżącym folderze i wszystkich podfolderach za pomocą tego pliku 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

Użycie:

checkvideo.bat [filter]

Jeśli nie dasz jednego filtru, dostaniesz ‘mp4’.

Próbki: checkvideo.batcheckvideo.bat *.avi

Setup: Pobierz FFmpeg dla Windows stąd: https://ffmpeg.zeranoe.com/builds/ ](https://ffmpeg.zeranoe.com/builds/) i rozpakuj je Zmień `C:\ffmpeg\binDla Windows, możesz ‘wsadowo’ sprawdzić integralność filmów w bieżącym folderze i wszystkich podfolderach za pomocą tego pliku 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

Użycie:

checkvideo.bat [filter]

Jeśli nie dasz jednego filtru, dostaniesz ‘mp4’.

Próbki: checkvideo.batcheckvideo.bat *.avi

Setup: Pobierz FFmpeg dla Windows stąd: https://ffmpeg.zeranoe.com/builds/ ]0x3& i rozpakuj je Zmień w pliku bat na ścieżkę gdzie rozpakowałeś ffmpeg Umieść checkvideo.bat na folderze zawartym w Path lub dodaj jego folder do zmiennej środowiskowej 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();

Referencja: 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

Łatwiejsza wersja

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

Będzie to drukować nazwy plików w trakcie ich przetwarzania.

error.log będzie zawierało błędy.

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

MediaInfo ](http://mediainfo.sourceforge.net/) jest doskonałym narzędziem do uzyskania informacji o każdym pliku wideo, który chcesz rzucić na niego. To może być w stanie podświetlić informacje, które chcesz.

Innym narzędziem jest GSpot ale nie był aktualizowany od 2007 roku.

Spróbuj dać każdemu z nich znany dobry i znany zły plik i porównaj wyniki.

Używałem GSpot, dopóki nie przestał być aktualizowany, potem przerzuciłem się na MediaInfo.

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

Problem z inną odpowiedzią używającą ffmpeg do rekodowania do formatu null polega na tym, że zajmuje to naprawdę dużo czasu. Zwłaszcza, jeśli chcesz sprawdzić wiele plików w katalogu.

Szybkim sposobem byłoby wygenerowanie miniatur dla wszystkich filmów i zobaczenie, gdzie generowanie miniatur kończy się niepowodzeniem.

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;

Ta metoda okazała się znacznie LEPSZA niż inne.

Jednakże, jest pewne ZAPOWIEDŹ. Metoda ta może dać błędne wyniki, ponieważ czasami miniaturki mogą być generowane nawet dla uszkodzonych plików. Np. jeśli plik wideo jest uszkodzony tylko na końcu, ta metoda zawiedzie.