Bagaimana saya bisa memeriksa integritas file video (avi, mpeg, mp4 ...)?

126

Judul ini bisa agak menyesatkan, jadi izinkan saya menjelaskan ...

Saya mengunduh file video ... mpeg, avi - menjadi salah satu format populer. Sekarang, jika saya mengunduhnya, dan unduhannya terputus di tengah uhm ... unduh, maka, misalnya, Windows Media Player akan memberikan beberapa kesalahan dan menolak untuk memutarnya (walaupun file tersebut, katakanlah, 98% selesai). Tapi, pemain seperti KMPlayer, atau MediaPlayer Classic akan memainkannya sampai saat itu (sebagai soal fakta, mereka dapat memainkannya saat sedang diunduh juga).

Jadi, saya tertarik, ... tanpa menggunakan sarana pengunduhan (pengelola unduhan dan sejenisnya) untuk mengamankan file sepenuhnya diunduh, bagaimana seseorang dapat memverifikasi apakah file video tersebut diunduh secara keseluruhan, dan lengkap?

Benteng
sumber
MPEG yang tidak lengkap harus dimainkan tanpa masalah. AVI memiliki indeks untuk pencarian cepat di akhir file, yang beberapa pemain akan gunakan dan beberapa tidak memerlukan atau akan diabaikan.
bobince
7
Incomplete MPEG should play with no problems.@karena, pertanyaannya adalah bagaimana memeriksa korupsi, bukan bagaimana memainkan file yang tidak lengkap. Bahkan jika suatu format mendukung pemutaran file yang tidak lengkap, masih mungkin untuk memeriksa korupsi jika file tersebut tidak sesuai dengan spesifikasi format. Misalnya, Anda masih dapat membaca file teks biasa yang tidak lengkap, tetapi Anda masih dapat mendeteksi jika file tersebut memiliki masalah seperti apakah itu berakhir di tengah kalimat atau ada sepotong informasi yang jelas hilang di tengah.
Synetech

Jawaban:

135

Anda dapat menggunakan fitur dalam ffmpegkonverter video: jika Anda menentukannya untuk mengkode ulang video menjadi tidak ada, itu hanya akan membaca file input dan melaporkan kesalahan yang akan muncul. Ini proses yang sangat cepat karena bingkai video baru saja dibaca, diperiksa dan dijatuhkan diam-diam.

Contoh perintah baris: (untuk Linux)

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

-v errorberarti tingkat verbositas tertentu (untuk menunjukkan beberapa kesalahan yang biasanya disembunyikan karena mereka tidak terlalu memengaruhi permainan).

Anda akan mendapatkan log kesalahan penuh dengan beberapa informasi umum tentang file ffmpeg akan ditampilkan, jadi ini mungkin akan memerlukan perhatian Anda, melalui filter dapat ditulis untuk melakukan pemeriksaan batch file yang serupa.

FFmpeg juga tersedia untuk Windows di sini . Baris perintah akan hampir identik dengan pengecualian redirect stderr:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
whitequark
sumber
5
Kecepatan yang sama seolah-olah akan mengkonversi.
Seseorang
8
Pilihan lain adalah ffprobepaket yang disertakan ffmpeg. Itu tidak melakukan konversi tetapi hanya membaca info metadata dari file. Oleh karena itu akan mendeteksi kesalahan dalam metadata tetapi tidak akan menemukan masalah dalam file itu sendiri. Secara pribadi menggunakan ffprobeuntuk membuat verifikasi cepat dari unggahan sebelum memproses lebih lanjut
mente
1
Tampaknya memakan waktu selama menonton film sayangnya, tetapi sepertinya itu berhasil
MattPark
3
Jika, seperti yang dinyatakan OP, "jeda unduhan di tengah uhm ... unduh", sangat mungkin bahwa semua aliran akan terganggu, sehingga Anda dapat mendeteksi kesalahan ini dengan membatasi penguraian sandi hanya pada satu trek audio (menggunakan -map), yang secara signifikan akan mempercepat operasi: ffmpeg -v error -i in.mkv -map 0:1 -f null …Jika ada kesalahan, itu akan mencatat posisi byte, yang dapat Anda gunakan untuk memotong file (satu atau dua megabyte lebih awal agar aman) dan kemudian melanjutkan pengunduhan.
Lumi
3
Mungkin butuh 4 1/2 menit bagi saya untuk menguji file .mkv lama 1GB 1 jam, pada prosesor hex core lama. Semua core dimaksimalkan selama tes. Saya hex mengedit salinan file dan menambahkan beberapa blok 00 untuk mensimulasikan kerusakan. Log kesalahan melaporkan kesalahan dengan benar. File tanpa kesalahan mengembalikan error.log kosong
TripleAntigen
12

Saya menyukai ide untuk menggunakan di ffmpeg -f nullatas, tetapi saya sebenarnya ingin mengotomatiskan proses menggunakan output itu. Secara khusus, skenario umum yang saya miliki dengan koleksi video musik saya adalah bahwa saya memiliki beberapa klip yang memiliki resolusi yang sama, dan saya ingin membedakan log verifikasi untuk file-file tersebut untuk menghapus yang paling rusak.

Sayangnya, ffmpeg sejauh ini tidak memiliki cara untuk menonaktifkan mode interaktifnya, yang menghasilkan derau untuk kasus penggunaan ini. Saya akhirnya meretas skrip pembungkus sederhana untuk melakukan penyaringan:

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

Contoh 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
pfalcon
sumber
1
jika Anda membuatnya sehingga mengganti bagian yang rusak dengan bagian yang baik, itu akan lebih baik
akostadinov
Saya mendapatkan kesalahan menggunakan ini:
Akshit Rewari
2
Traceback (panggilan terakhir terakhir): File "F: \ filecheck.py", baris 6, dalam <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: daftar indeks di luar jangkauan
Akshit Rewari
1

Untuk windows, Anda dapat 'batch' memeriksa integritas untuk video pada folder saat ini dan semua subfolder dengan file bat ini:

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

Menggunakan:

checkvideo.bat [filter]

Jika Anda tidak memberikan satu filter, akan mendapatkan '* .mp4'.

Sampel: checkvideo.bat checkvideo.bat *.avi

Setup: Unduh FFmpeg untuk Windows dari sini: https://ffmpeg.zeranoe.com/builds/ dan unzip mereka. Ubah C:\ffmpeg\bin\file bat untuk path tempat Anda membuka zip ffmpeg. Letakkan checkvideo.batdi folder yang termasuk dalam Path atau tambahkan foldernya ke Variabel lingkungan jalur

Juan Antonio Tubío
sumber
Jawaban Juan Antonio Tubío bekerja untuk saya untuk memeriksa integritas video. Tetapi bagaimana saya bisa membaca file log dan mendeteksi waktu di mana video rusak. Contoh log. [h264 @ 00000173649787c0] decode cabac dari qscale diff gagal di 64 7 [h264 @ 00000173649787c0] kesalahan saat decoding MB 64 7, bytestream 38638
J.Duck
1

Masalah dengan jawaban lain yang digunakan ffmpeguntuk pengodean ulang ke nullformat adalah bahwa hal itu membutuhkan waktu yang sangat lama. Terutama, jika Anda ingin memeriksa beberapa file dalam direktori.

Cara cepat akan menghasilkan thumbnail untuk semua video, dan melihat di mana generasi thumbnail gagal.

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;

Metode ini ternyata jauh lebih CEPAT daripada metode lainnya.

Namun, ada CAVEAT. Metode ini dapat menghasilkan hasil yang salah, karena terkadang thumbnail dapat dihasilkan bahkan untuk file yang rusak. Misal jika file video rusak hanya pada akhirnya, metode ini akan gagal.

shivams
sumber
0

MediaInfo adalah alat yang hebat untuk mendapatkan info tentang file video apa pun yang Anda inginkan . Ini mungkin dapat menyoroti info yang Anda inginkan.

Alat lain adalah GSpot tetapi belum diperbarui sejak 2007.

Coba berikan masing-masing file yang baik dan dikenal buruk dan bandingkan hasilnya.

Saya dulu menggunakan GSpot sampai berhenti diperbarui, lalu beralih ke MediaInfo

Shevek
sumber
1
Saya memiliki beberapa versi lama GSpot di komputer saya ... tetapi ini adalah alat untuk sesuatu yang sama sekali berbeda (menentukan kode / decode ...). Ini tidak ada hubungannya dengan ini. Saya akan memeriksa mediainfo.
Benteng
GSpot akan melaporkan jika ukuran file atau jumlah frame tidak sesuai dengan yang diharapkan dari indeks (di suatu tempat di sisi kiri, sudah lama sejak saya menggunakannya!), Juga versi kemudian menambahkan banyak fungsi.
Shevek
mediainfo dapat memindai direktori secara rekursif: untuk mendapatkan laporan semua file di level apa pun mulai dari folder saat ini, jalankan saja mediainfo *.
ccpizza
1
mediainforupanya tidak memeriksa kelengkapan. Saya mengambil webmfile video 33 MB dan truncatemelakukannya setengah. mediainfomasih memiliki hasil yang hampir sama untuk keduanya, tidak ada tanda-tanda korupsi. Setelah truncatemencapai 1 MB, masih belum ada tanda-tanda korupsi yang jelas dalam hasilnya. Hanya jika Anda melihat lebih dalam pada output, ada beberapa informasi yang bertentangan. Tetapi bagian-bagian ini bergantung pada format file video, sehingga Anda tidak dapat mengotomatisasi deteksi ini.
Tino
3
mediainfotidak membaca apa pun kecuali metadata. Ini tidak akan memeriksa validitas file Anda dengan cara apa pun.
DanielSmedegaardBuus