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

126

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

Pobieram plik wideo ... mpeg, avi - jeden z popularnych formatów. Teraz, jeśli go pobieram, a pobieranie przerywa się w środku uhm ... pobieranie, to na przykład Windows Media Player zgłasza błąd i odmawia jego odtworzenia (chociaż plik jest, powiedzmy, 98% ukończone). Ale gracze tacy jak KMPlayer lub MediaPlayer Classic będą go odtwarzać do tego momentu (w rzeczywistości mogą grać także podczas pobierania).

Tak więc jestem zainteresowany ... bez korzystania z jakichkolwiek metod pobierania (menedżerów pobierania i podobnych), aby zabezpieczyć plik jest całkowicie pobrany, jak można sprawdzić, czy plik wideo jest pobrany w całości i czy jest kompletny?

Wieża
źródło
Niekompletny MPEG powinien grać bez problemów. AVI ma indeksy do szybkiego wyszukiwania na końcu pliku, z których korzystają niektórzy gracze, a niektórzy nie wymagają lub będą ignorować.
bobince
7
Incomplete MPEG should play with no problems.@ Bobince, pytanie brzmiało / jak sprawdzić, czy nie ma uszkodzeń, a nie jak odtworzyć niekompletny plik. Nawet jeśli format obsługuje odtwarzanie niekompletnych plików, nadal powinno być możliwe sprawdzenie, czy plik nie jest zgodny ze specyfikacjami formatu. Na przykład nadal możesz odczytać niekompletny plik tekstowy, ale nadal możesz wykryć, czy plik ma problemy, np. Czy kończy się w środku zdania, czy w środku jest fragment brakujących informacji.
Synetech,

Odpowiedzi:

135

Możesz użyć funkcji ffmpegkonwertera wideo: jeśli wybierzesz opcję przekodowywania wideo do niczego, po prostu odczyta plik wejściowy i zgłosi wszelkie pojawiające się błędy. Jest to bardzo szybki proces, ponieważ ramki wideo są właśnie odczytywane, sprawdzane i dyskretnie upuszczane.

Przykładowy wiersz poleceń: (dla systemu Linux)

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

-v erroroznacza pewien poziom gadatliwości (aby pokazać niektóre błędy, które normalnie są ukryte, ponieważ nie wpływają zbytnio na grywalność).

Otrzymasz pełny dziennik błędów z pewnymi ogólnymi informacjami o pliku, który wyśle ​​ffmpeg, więc prawdopodobnie będzie to wymagało Twojej uwagi, dzięki filtrom można napisać, aby wykonać kontrolę partii podobnych plików.

FFmpeg jest również dostępny tutaj dla systemu Windows . Wiersz polecenia będzie prawie identyczny, z wyjątkiem przekierowania stderr:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
Whitequark
źródło
5
Taka sama prędkość, jakby był konwertowany.
Ktoś
8
Inną opcją jest ffprobedołączona do pakietu ffmpeg. Nie dokonuje żadnej konwersji, ale po prostu odczytuje informacje z metadanych z pliku. Dlatego wykryje błędy w metadanych, ale nie znajdzie żadnych problemów w samym pliku. Osobiście używam ffprobedo szybkiej weryfikacji przesłanych danych przed dalszym przetwarzaniem
pamiętaj
1
Wygląda na to, że trwa niestety tyle samo, co oglądanie filmu, ale wydaje się, że działa
MattPark
3
Jeśli, jak stwierdza OP, „pobieranie przerywa się w środku uhm ... pobieranie”, jest bardzo prawdopodobne, że wszystkie strumienie zostaną zakłócone, więc można wykryć ten błąd, ograniczając dekodowanie do tylko jednej ścieżki audio (używając -map), co znacznie przyspieszy działanie: ffmpeg -v error -i in.mkv -map 0:1 -f null …jeśli wystąpi błąd, zarejestruje pozycję bajtu, której można użyć do obcięcia pliku (megabajt lub dwa wcześniej, aby być bezpiecznym), a następnie wznowić pobieranie.
Lumi,
3
Testowanie pliku .mkv o długości 1 GB trwającego 1 godzinę zajęło mi około 4 1/2 minuty na starym procesorze sześciordzeniowym. Wszystkie rdzenie zostały zmaksymalizowane podczas testu. Szesnastkowo zredagowałem kopię pliku i dodałem kilka bloków 00, aby zasymulować uszkodzenie. Dziennik błędów poprawnie zgłaszał błędy. Pliki bez błędów zwróciły pusty error.log
TripleAntigen
12

Podobał mi się pomysł użycia ffmpeg -f nullpowyższego, ale tak naprawdę chciałbym zautomatyzować proces korzystania z tego wyjścia. W szczególności moim typowym scenariuszem z kolekcją wideoklipów jest to, że mam kilka klipów o tej samej rozdzielczości i chciałbym różnicować dzienniki weryfikacji dla tych plików, aby usunąć te najbardziej uszkodzone.

Niestety, ffmpeg do tej pory nie ma możliwości wyłączenia trybu interaktywnego, który emituje hałas w tym przypadku użycia. Skończyło się na zhakowaniu prostego skryptu opakowującego w celu 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 dane wyjściowe:

[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
pfalcon
źródło
1
jeśli
zrobicie
Występuje
2
Traceback (ostatnie ostatnie wywołanie): Plik „F: \ filecheck.py”, wiersz 6, w <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' .% sys.argv [1]), odczytu () IndexError: wskaźnik lista poza zakresem
Akshit Rewari
1

W przypadku systemu Windows można „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

Posługiwać się:

checkvideo.bat [filter]

Jeśli nie podasz jednego filtru, otrzymasz „* .mp4”.

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

Konfiguracja: Pobierz FFmpeg dla Windows stąd: https://ffmpeg.zeranoe.com/builds/ i rozpakuj je Zmień C:\ffmpeg\bin\plik bat dla ścieżki, z której rozpakowałeś ffmpeg Umieść checkvideo.batfolder zawarty w ścieżce lub dodaj jego folder do Zmienna środowiskowa ścieżki

Juan Antonio Tubío
źródło
Odpowiedź Juana Antonio Tubío działa dla mnie, aby sprawdzić integralność wideo. Ale jak mogę odczytać plik dziennika i wykryć czas, w którym wideo jest uszkodzone. Przykład dziennika [h264 @ 00000173649787c0] dekodowanie cabac z qscale diff nie powiodło się przy 64 7 [h264 @ 00000173649787c0] błąd podczas dekodowania MB 64 7, bystestream 38638
J.Duck
1

Problem z drugą odpowiedzią ffmpegużywaną do przekodowywania do nullformatu 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 sprawdzenie, gdzie generowanie miniatur się nie powiedzie.

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 SZYBSZA niż inne metody.

Istnieje jednak CAVEAT. Ta metoda może dawać błędne wyniki, ponieważ czasami miniaturę można wygenerować nawet w przypadku uszkodzonych plików. Np. Jeśli plik wideo jest uszkodzony tylko na końcu, ta metoda zawiedzie.

Shivams
źródło
0

MediaInfo to świetne narzędzie do uzyskiwania informacji o każdym pliku wideo, który chcesz w niego wrzucić. Może to umożliwić wyróżnienie potrzebnych informacji.

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

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

Używałem GSpot, dopóki nie przestał być aktualizowany, a potem przełączyłem się na MediaInfo

Shevek
źródło
1
Mam starą wersję GSpot na moim komputerze ... ale jest to narzędzie do czegoś zupełnie innego (określanie kodu / dekodowania ...). To nie ma z tym nic wspólnego. Sprawdzę mediainfo.
Wież
GSpot zgłosi, jeśli rozmiar pliku lub liczba klatek nie odpowiadają oczekiwanemu z indeksu (gdzieś po lewej stronie, minęło trochę czasu, odkąd go użyłem!), Również późniejsze wersje dodały wiele funkcji.
Shevek
mediainfo może rekurencyjnie skanować katalogi: aby uzyskać raport wszystkich plików na dowolnym poziomie, zaczynając od bieżącego folderu, po prostu uruchom mediainfo *.
ccpizza
1
mediainfonajwyraźniej nie sprawdza kompletności. Wziąłem webmplik wideo truncateo wielkości 33 MB i d do połowy. mediainfonadal miał prawie taki sam wynik dla obu, bez widocznych oznak korupcji. Po truncatewejściu do 1 MB nadal nie było wyraźnych oznak uszkodzenia danych wyjściowych. Tylko jeśli przyjrzysz się dokładniej wynikowi, znajdziesz kilka sprzecznych informacji. Ale te części zależą od formatu pliku wideo, więc nie można zautomatyzować tego wykrywania.
Tino,
3
mediainfonie czyta nic oprócz metadanych. Nie sprawdzi to w żaden sposób ważności pliku.
DanielSmedegaardBuus