Bir video dosyasının bütünlüğünü nasıl kontrol edebilirim (avi, mpeg, mp4…)?


126

Bu başlık biraz yanıltıcı olabilir, bu yüzden açıklayayım ...

Bir video dosyasını indiriyorum ... mpeg, avi - popüler biçimlerden biri. Şimdi, eğer indiriyorsam ve indirme işlemi Uhm'un tam ortasında ... indiriliyorsa, o zaman, örneğin, Windows Media Player bir hata verir ve oynatmayı reddeder (dosya olmasına rağmen, diyelim ki, % 98 tamamlandı). Ancak, KMPlayer veya MediaPlayer Classic gibi oyuncular bu noktaya kadar oynayacaklar (gerçekte, indirilirken de oynayabilirler).

Bu yüzden, ilgileniyorum, ... dosyayı tamamen indirmeyi güvence altına almak için herhangi bir indirme aracı kullanmadan (indirme yöneticileri ve benzeri), video dosyasının tamamen indirilip yüklenmediğini ve nasıl tamamlandığını nasıl doğrulayabiliriz?


Eksik MPEG problemsiz oynamalıdır. AVI, bazı oyuncuların kullanacağı ve bazılarının gerektirmediği veya görmezden gelmeyeceği dosyanın sonunda hızlı arama için endekslere sahiptir.
bobince

7
Incomplete MPEG should play with no problems.@bobince, eksik bir dosyayı nasıl çalacağınızı değil, yolsuzluğun nasıl kontrol edileceğini / soruydu. Bir format eksik dosyaların oynatılmasını desteklese bile, dosyanın format spesifikasyonlarına uyup uymadığını kontrol etmek mümkün olmalıdır. Örneğin, hala tamamlanmamış bir düz metin dosyasını okuyabilirsiniz, ancak dosyanın bir cümlenin ortasında bitip bitmediğini veya ortada açıkça eksik bilgilerin bulunduğu bir yığın olup olmadığını tespit etmeye devam edebilirsiniz.
Synetech

Yanıtlar:


135

ffmpegVideo dönüştürücüsünde bir özellik kullanabilirsiniz : videoyu hiçbir şey olarak yeniden kodlamak için belirtirseniz, sadece giriş dosyasını okur ve beliren tüm hataları rapor eder. Bu çok hızlı bir işlemdir çünkü video kareleri okunuyor, kontrol ediliyor ve sessizce bırakılıyor.

Örnek komut satırı: (Linux için)

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

-v errorbelirli bir ayrıntı düzeyi anlamına gelir (oynanabilirliği çok fazla etkilemediği için normalde gizli olan bazı hataları göstermek için).

Ffmpeg dosyası ile ilgili bazı genel bilgileri içeren tam bir hata günlüğü alırsınız, bu nedenle dikkat etmeniz gerekir, filtreler aracılığıyla benzer dosyaların toplu denetimini gerçekleştirmek için yazılabilir.

FFmpeg burada Windows için de mevcuttur . Komut satırı stderr yönlendirme istisnasıyla neredeyse aynı olacaktır:

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

5
Dönüştürüyormuş gibi aynı hızda.
Biri

8
Başka bir seçenek de ffprobepakette ffmpeg. Herhangi bir dönüşüm yapmaz ancak dosyadaki meta veri bilgilerini okur. Bu nedenle meta verilerdeki hataları algılar ancak dosyanın kendisinde herhangi bir sorun bulamaz. Şahsen ffprobe, daha fazla işlem yapmadan önce yüklenenlerin hızlıca kontrol edilmesini sağlamak için kullanın
mente

1
Maalesef filmi seyrettiği sürece
başlıyor

3
OP'nin belirttiği gibi, "uhm ... download'ın ortasındaki indirmeler" indiriliyorsa, tüm akışların bozulması olasılığı yüksektir , bu nedenle kod çözmeyi yalnızca bir ses parçasıyla sınırlandırarak (kullanarak -map) bu hatayı tespit edebilirsiniz , hangi önemli ölçüde işlem hızlandıracak: ffmpeg -v error -i in.mkv -map 0:1 -f null …Bir hata varsa, dosyayı kısaltmak için kullanabileceğiniz bayt konumunu günlüğe kaydeder (güvenli olması için bir megabayt veya iki saniye) ve daha sonra indirmeye devam edin.
Lumi

3
Eski bir hex core işlemcide 1GB 1 saat uzunluğunda .mkv dosyasını test etmek belki 4 1/2 dakika sürdü. Test sırasında tüm çekirdekler maksimuma çıkarıldı. Hex, dosyanın bir kopyasını düzenledi ve hasarı simüle etmek için 00 bazı bloklar ekledi. Hata günlüğü hataları doğru bildirdi.
Hatasız

12

ffmpeg -f nullYukarıda kullanma fikrini sevdim , ancak aslında bu çıktıyı kullanma işlemini otomatikleştirmek istiyorum. Özellikle, müzik video koleksiyonumla ilgili ortak senaryom, aynı çözünürlüğe sahip birkaç klibe sahip olduğum ve bu dosyaların en çok kırılanları çıkarması için doğrulama günlüklerini ayırmak istiyorum.

Ne yazık ki, şu ana kadar ffmpeg, bu kullanım durumu için gürültü çıkaran etkileşimli modunu devre dışı bırakmanın bir yoluna sahip değil. Filtreleme yapmak için basit bir sarmalayıcı komut dosyası kesmekle sona erdi:

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

Örnek çıktı:

[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
kırılmış parçaları iyi parçalarla değiştirecek şekilde yaparsanız, daha iyi olurdu
akostadinov

Bunu kullanırken bir hata alıyorum:
Akshit Rewari

2
Geri izleme (en son yapılan arama): Dosya "F: \ filecheck.py", satır 6, <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: dizini dizinin dışında
listele

1

Windows için, geçerli klasördeki ve tüm alt klasörlerdeki videoların bütünlüğünü bu yarasa dosyasında 'toplu olarak kontrol edebilirsiniz':

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

kullanın:

checkvideo.bat [filter]

Bir filtre vermezseniz, '* .mp4' alır.

Örnekler: checkvideo.bat checkvideo.bat *.avi

Kurulum: FFmpeg for Windows programını buradan indirin: https://ffmpeg.zeranoe.com/builds/ ve unzip C:\ffmpeg\bin\un fermuarını açtığınız yolun yarasa dosyasındaki değişiklik ffmpeg'in yolunu checkvideo.batiçeren bir klasöre yerleştirin veya klasörünü Yol ortamı değişkeni


Juan Antonio Tubio'nun cevabı bana video bütünlüğünü kontrol etmek için çalışıyor. Ancak, günlük dosyasını nasıl okuyabilirim ve videonun bozulduğu zamanı nasıl tespit edebilirim. Log örneği. [h264 @ 00000173649787c0] qscale diff'in cabac kod çözme işlemi 64 7'de başarısız oldu [h264 @ 00000173649787c0] MB 64 7 kodunun çözülmesi sırasında hata oluştu, ancak 38638
J.Duck

1

Biçimlendirmek ffmpegiçin yeniden kodlamada kullanılan diğer cevabın sorunu null, gerçekten uzun zaman alması. Özellikle, bir dizindeki birden fazla dosyayı kontrol etmek istiyorsanız.

Hızlı bir yol, tüm videolar için küçük resimler oluşturmak ve küçük resimlerin nerede hata verdiğini görmek olacaktır.

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;

Bu yöntem diğer yöntemlerden daha HIZLI olduğu ortaya çıktı.

Ancak, bir CAVEAT var. Bu yöntem yanlış sonuçlar verebilir, çünkü bazen bozuk dosyalar için bile küçük resimler oluşturulabilir. Örneğin, video dosyası sadece sonunda bozulmuşsa, bu yöntem başarısız olacaktır.


0

MediaInfo , atmak istediğiniz video dosyası hakkında bilgi edinmek için harika bir araçtır. Bu istediğiniz bilgiyi vurgulayabilir.

Başka bir araç GSpot'dur ancak 2007'den beri güncellenmemiştir.

Her birine bilinen ve iyi bilinen kötü dosyaları vermeyi deneyin ve sonuçları karşılaştırın.

Güncellenmeyi bırakana kadar GSpot'u kullandım, daha sonra MediaInfo'ya geçtim


1
Makinemde GSpot'un eski bir sürümü var ... ama tamamen farklı bir şey için bir araç (kod belirleme / kod çözme ...). Bununla bir ilgisi yok. Mediainfo'yu kontrol edeceğim.
Rook

GSpot, dosya boyutu veya kare sayısının endeksten beklenenle uyuşmadığını bildirir (sol tarafta bir yerde, kullandığımdan bu yana bir süre geçti!), Ayrıca daha sonraki sürümlerde daha fazla işlevsellik eklendi.
Shevek

mediainfo tekrarlamalı olarak dizinleri tarayabilir: Geçerli klasörden başlayarak herhangi bir düzeyde tüm dosyaların raporunu almak için basitçe çalıştırın mediainfo *.
ccpizza

1
mediainfogörünüşe göre bütünlüğü kontrol etmez. 33 MB'lık bir webmvideo dosyasını çektim truncateve yarıya d. mediainfoYine de her ikisi için de aynı çıktı vardı, bariz bir yolsuzluk işareti yok. truncate1 MB'ye ulaştıktan sonra çıktıda net bir bozulma belirtisi yoktu. Sadece çıktıya daha derin bir bakış attıysanız, bazı çelişkili bilgiler vardı. Ancak bu parçalar video dosyasının biçimine bağlıdır, bu yüzden bu algılamayı otomatikleştiremezsiniz.
Tino,

3
mediainfometa verilerden başka bir şey okumaz. Bu, dosyanızın geçerliliğini hiçbir şekilde kontrol etmez.
DanielSmedegaardBuus,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.