Saya memiliki banyak video yang ingin saya periksa apakah sudah lengkap atau tidak. Beberapa dari mereka mungkin diunduh sebagian, tetapi tidak salah. Bagaimana saya dapat memeriksa secara efisien apakah video ini sepenuhnya diunduh?
Jika saya memiliki tautan, saya akan memeriksa ukurannya, tetapi saya tidak.
Saya mencoba menggunakan ffprobe
dan mediainfo
. ffprobe
melaporkan masalah kecil pada file yang diunduh sebagian, tetapi juga melaporkan masalah serupa dengan beberapa file yang sepenuhnya diunduh. Haruskah saya gunakan ffmpeg
untuk membaca seluruh file dan membandingkan panjang video untuk memeriksa apakah mereka diunduh? Apakah ada solusi yang lebih baik?
Jawaban:
ffmpeg
adalah alat agnostik OS yang mampu menentukan apakah file video telah sepenuhnya diunduh. Perintah di bawah ini memerintahkanffmpeg
untuk membaca video input dan mengkodekan video menjadi kosong. Selama proses pengkodean, setiap kesalahan seperti frame yang hilang adalah output ke test.log.Jika file video tidak sepenuhnya diunduh, akan ada banyak baris di file test.log. Misalnya, .1 MB hilang dari file video menghasilkan 71 baris kesalahan. Jika video sepenuhnya diunduh dan belum rusak, tidak ada kesalahan ditemukan, dan tidak ada garis yang dicetak untuk test.log.
Edit
Dalam contoh yang saya berikan di atas, saya menguji seluruh file karena video uji yang saya unduh adalah torrent, yang dapat memiliki potongan yang hilang di seluruh file.
Menambahkan
-sseof -60
ke daftar argumen akan memeriksa 60 detik terakhir dari file, yang jauh lebih cepat.Anda memerlukan ffmpeg versi yang lebih baru, 2,8 tidak memiliki flag sseof, jadi saya menggunakan 3.0.
sumber
ffmpeg
? Maksud saya berusaha untuk 99% tanpa memproses semua video, dan memeriksa apakah itu berfungsi dengan baik tanpa kesalahan.-ss
dan-sseof
, ffmpeg membaca dan memproses seluruh file. Jadi, bagaimanapun, membuka video di VLC dan mengklik di dekat akhir akan lebih cepat.MediaInfo menampilkan garis:
jika file tidak lengkap seperti yang diharapkan oleh spesifikasi format.
Karena secara teknis tidak ada perbedaan antara file yang salah (tidak memenuhi spesifikasi tentang batas file) file muxed dan sebagian diunduh, secara teknis tidak mungkin untuk melakukan perbedaan antara file kereta dan file yang diunduh sebagian.
Tes (lanjutan) lain dapat dilakukan misalnya membaca indeks file .mp4 dan memeriksa apakah file mengimbangi + ukuran bingkai dari frame terakhir berada dalam ukuran file dari file yang Anda dapatkan, tetapi itu tidak persis seperti apa yang Anda cari untuk (jika ada metadata misalnya poster di file sumber, di akhir file, dan file terpotong tepat sebelum poster ini, unduhan parsial masih tidak terdeteksi dalam setiap kasus). Itu tidak diterapkan di MediaInfo tetapi Anda dapat menambahkan permintaan fitur MediaInfo .
Dalam semua kasus, sangat sulit untuk mendeteksi semua unduhan parsial, karena ukuran total file tidak ditunjukkan dalam sebagian besar format file video sehingga Anda dapat memastikan file terpotong, tetapi Anda tidak dapat memastikan file tidak terpotong. Satu-satunya cara untuk memastikan Anda mengunduh file lengkap adalah dengan mendapatkan ukuran file dari tempat lain (dan lebih baik: miliki hash misalkan MD5).
PS: pertanyaan ini tidak spesifik untuk sistem operasi apa pun.
sumber
-f
(tampilan informasi lengkap). Bisakah Anda membantu mendapatkanTruncated
lapangan?mediainfo * | grep -E "^(IsTruncated|Complete name)"
mana nama file dari file yang sesuai ditampilkan langsung di atas baris "IsTruncated: Yes".Saya punya file di mana ffmpeg (v3.1.1) dengan -sse -60 tidak menunjukkan peringatan apa pun dan hanya keluar tanpa indikasi bahwa ada sesuatu yang salah. Mediainfo juga tidak menunjukkan bahwa file tersebut terpotong. Hanya meninggalkan -sseof -60 yang akan melaporkan kesalahan dengan ffmpeg. Jadi saya kembali ke mencoba ffprobe. Tampaknya sedikit lebih cepat daripada ffmpeg.
menghasilkan output ini
Saya belum menemukan positif palsu (seperti dilaporkan oleh OP).
Sunting : ffprobe ada di testfiles saya sekitar 10% lebih cepat dari ffmpeg, tetapi hanya jika Anda menginstruksikannya untuk menggunakan semua core dengan opsi '-baca 0'. Kalau tidak, ia hanya menggunakan satu inti / utas dan lebih lambat.
sumber