ฉันจะตรวจสอบความสมบูรณ์ของไฟล์วิดีโอได้อย่างไร (avi, mpeg, mp4 …)?


126

ชื่อนี้อาจทำให้เข้าใจผิดได้ดังนั้นให้ฉันอธิบาย ...

ฉันกำลังดาวน์โหลดไฟล์วิดีโอ ... mpeg, avi - เป็นหนึ่งในรูปแบบที่ได้รับความนิยม ทีนี้ถ้าฉันกำลังดาวน์โหลดและการดาวน์โหลดหยุดกลางคัน uhm ... download ดังนั้น Windows Media Player จะให้ข้อผิดพลาดและปฏิเสธที่จะเล่น (แม้ว่าไฟล์จะเป็นเช่นนั้นสมมุติว่า เสร็จสมบูรณ์ 98%) แต่ผู้เล่นเช่น KMPlayer หรือ MediaPlayer Classic จะเล่นจนถึงจุดนั้น (ตามความเป็นจริงพวกเขาสามารถเล่นได้ในขณะที่กำลังดาวน์โหลดด้วย)

ดังนั้นฉันสนใจ ... โดยไม่ต้องใช้วิธีการดาวน์โหลดใด ๆ (ตัวจัดการดาวน์โหลดและเหมือนกัน) เพื่อรักษาความปลอดภัยให้กับไฟล์ที่ดาวน์โหลดมาอย่างสมบูรณ์วิธีการหนึ่งที่สามารถตรวจสอบได้ว่าไฟล์วิดีโอนั้นถูกดาวน์โหลดมาทั้งหมดหรือไม่


MPEG ที่ไม่สมบูรณ์ควรเล่นโดยไม่มีปัญหา AVI มีดัชนีสำหรับการค้นหาอย่างรวดเร็วในตอนท้ายของไฟล์ซึ่งผู้เล่นบางคนจะใช้และบางคนไม่ต้องการหรือไม่สนใจ
bobince

7
Incomplete MPEG should play with no problems.@Bobince คำถามคือ / วิธีตรวจสอบความเสียหายไม่ใช่วิธีการเล่นไฟล์ที่ไม่สมบูรณ์ แม้ว่ารูปแบบจะรองรับการเล่นไฟล์ที่ไม่สมบูรณ์ แต่ก็ยังคงเป็นไปได้ที่จะตรวจสอบความเสียหายหากไฟล์นั้นไม่เป็นไปตามข้อกำหนดรูปแบบ ตัวอย่างเช่นคุณยังสามารถอ่านไฟล์ข้อความธรรมดาที่ไม่สมบูรณ์ แต่คุณยังสามารถตรวจสอบได้ว่าไฟล์นั้นมีปัญหาเช่นถ้ามันจบลงตรงกลางประโยคหรือมีข้อมูลที่ขาดหายไปอย่างชัดเจนอยู่ตรงกลาง
Synetech

คำตอบ:


135

คุณสามารถใช้คุณสมบัติในffmpegตัวแปลงวิดีโอ: หากคุณจะระบุให้บันทึกวิดีโอใหม่เป็นอะไรมันจะอ่านไฟล์อินพุตและรายงานข้อผิดพลาดที่จะปรากฏขึ้น นี่เป็นกระบวนการที่รวดเร็วมากเพราะเฟรมวิดีโอเพิ่งอ่านตรวจสอบและหายไปอย่างเงียบ ๆ

ตัวอย่างบรรทัดคำสั่ง: (สำหรับ Linux)

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

-v errorหมายถึงระดับของการฟุ่มเฟื่อย (เพื่อแสดงข้อผิดพลาดบางอย่างที่ปกติจะถูกซ่อนไว้เพราะพวกเขาไม่ส่งผลกระทบต่อความสามารถในการเล่นมาก)

คุณจะได้รับบันทึกข้อผิดพลาดเต็มรูปแบบพร้อมข้อมูลทั่วไปบางอย่างเกี่ยวกับไฟล์ ffmpeg ที่จะส่งออกดังนั้นสิ่งนี้อาจจะต้องให้ความสนใจของคุณผ่านตัวกรองสามารถเขียนเพื่อดำเนินการตรวจสอบแบทช์ของไฟล์ที่คล้ายกัน

FFmpeg ยังสามารถใช้ได้สำหรับ Windows ที่นี่ บรรทัดคำสั่งเกือบจะเหมือนกันยกเว้นการเปลี่ยนเส้นทาง stderr:

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

5
ความเร็วเดียวกับการแปลง
ใครบางคน

8
ตัวเลือกหนึ่งคือที่มาในแพคเกจที่มีffprobe ffmpegมันไม่ได้ทำการแปลงใด ๆ แต่เพียงอ่านข้อมูลเมตาจากไฟล์ ดังนั้นมันจะตรวจพบข้อผิดพลาดในข้อมูลเมตา แต่จะไม่พบปัญหาใด ๆ ภายในไฟล์เอง ส่วนตัวใช้ffprobeเพื่อให้การตรวจสอบอย่างรวดเร็วของการอัปโหลดก่อนที่จะดำเนินการต่อไป
Mente

1
ดูเหมือนว่าจะใช้เวลานานเท่าที่ดูหนัง แต่น่าเสียดายที่มันใช้งานได้
MattPark

3
หากในขณะที่สถานะ OP "ดาวน์โหลดหยุดกลาง uhm ... download" เป็นไปได้มากว่าสตรีมทั้งหมดจะหยุดชะงักดังนั้นคุณสามารถตรวจพบข้อผิดพลาดนี้ได้โดย จำกัด การถอดรหัสเป็นแทร็กเสียงเดียว (โดยใช้-map) ซึ่งจะเพิ่มความเร็วในการดำเนินการอย่างมีนัยสำคัญ: ffmpeg -v error -i in.mkv -map 0:1 -f null …หากมีข้อผิดพลาดมันจะบันทึกตำแหน่งไบต์ซึ่งคุณสามารถใช้เพื่อตัดทอนไฟล์ (หนึ่งเมกะไบต์หรือสองเวอร์ชันก่อนหน้านี้จะปลอดภัย) จากนั้นทำการดาวน์โหลดต่อ
Lumi

3
อาจใช้เวลาประมาณ 4 1/2 นาทีสำหรับฉันในการทดสอบไฟล์. mkv ขนาด 1GB 1 ชั่วโมงที่ยาวนานบนโปรเซสเซอร์ hex core เก่าแก่ แกนทั้งหมดถูก maxed ในระหว่างการทดสอบ ฉันเลขฐานสิบหกแก้ไขสำเนาของไฟล์และเพิ่ม 00 บล็อกบางส่วนเพื่อจำลองความเสียหาย บันทึกข้อผิดพลาดรายงานข้อผิดพลาดอย่างถูกต้อง ไฟล์ที่ไม่มีข้อผิดพลาดส่งคืนข้อผิดพลาดว่างเปล่า
บล็อก

12

ฉันชอบแนวคิดของการใช้ffmpeg -f nullด้านบน แต่จริงๆแล้วฉันต้องการทำให้กระบวนการใช้ผลลัพธ์นั้นเป็นไปโดยอัตโนมัติ โดยเฉพาะอย่างยิ่งสถานการณ์ทั่วไปที่ฉันมีกับคอลเลกชันวิดีโอเพลงของฉันคือฉันมีคลิปไม่กี่ไฟล์ที่มีความละเอียดเท่ากันและฉันต้องการ diff บันทึกการตรวจสอบสำหรับไฟล์เหล่านั้นเพื่อลบอันที่เสียหายมากที่สุด

น่าเสียดายที่ ffmpeg ยังไม่มีวิธีปิดการใช้งานโหมดการโต้ตอบซึ่งส่งสัญญาณรบกวนสำหรับกรณีการใช้งานนี้ ฉันลงเอยด้วยการแฮกสคริปต์ wrapper อย่างง่าย ๆ เพื่อทำการกรอง:

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

ตัวอย่างผลลัพธ์:

[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
ถ้าคุณทำมันเพื่อให้มันแทนที่ส่วนที่หักด้วยชิ้นส่วนที่ดีนั่นจะดียิ่งขึ้น
akostadinov

ฉันได้รับข้อผิดพลาดในการใช้สิ่งนี้:
Akshit Rewari

2
การติดตามย้อนกลับ (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "F: \ filecheck.py", บรรทัด 6, ใน <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: ดัชนีรายการอยู่นอกช่วง
Akshit Rewari

1

สำหรับ windows คุณสามารถ 'แบทช์' ตรวจสอบความสมบูรณ์ของวิดีโอในโฟลเดอร์ปัจจุบันและโฟลเดอร์ย่อยทั้งหมดด้วยไฟล์ค้างคาวนี้:

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

ใช้:

checkvideo.bat [filter]

หากคุณไม่ได้ให้ตัวกรองหนึ่งตัวจะได้รับ '* .mp4'

ตัวอย่าง: checkvideo.bat checkvideo.bat *.avi

การติดตั้ง: ดาวน์โหลด FFmpeg สำหรับ Windows จากที่นี่: https://ffmpeg.zeranoe.com/builds/และเปิดเครื่องรูดเปลี่ยนC:\ffmpeg\bin\ไฟล์ค้างคาวสำหรับเส้นทางที่คุณได้เปิดเครื่อง ffmpeg วางไว้checkvideo.batในโฟลเดอร์ที่รวมอยู่ใน Path หรือเพิ่มโฟลเดอร์ของเขาลงใน ตัวแปรสภาพแวดล้อมของเส้นทาง


คำตอบของJuan Antonio Tubíoทำงานให้ฉันตรวจสอบความสมบูรณ์ของวิดีโอ แต่ฉันจะอ่านล็อกไฟล์และตรวจสอบเวลาที่วิดีโอเสียหายได้อย่างไร ตัวอย่างบันทึก [h264 @ 00000173649787c0] การถอดรหัส cabac ของ qscale diff ล้มเหลวที่ 64 7 [h264 @ 00000173649787c0] ข้อผิดพลาดขณะถอดรหัส MB 64 7 bytestream 38638
J.Duck

1

ปัญหากับคำตอบอื่น ๆ ที่ใช้ffmpegในการถอดรหัสเป็นnullรูปแบบคือใช้เวลานานมาก โดยเฉพาะถ้าคุณต้องการตรวจสอบไฟล์หลายไฟล์ในไดเรกทอรี

วิธีที่รวดเร็วคือการสร้างภาพขนาดย่อสำหรับวิดีโอทั้งหมดและดูว่าการสร้างภาพขนาดย่อล้มเหลวที่ไหน

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;

วิธีนี้กลายเป็นเร็วกว่าวิธีอื่นมาก

อย่างไรก็ตามมีถ้ำ วิธีนี้สามารถให้ผลลัพธ์ที่ผิดเพราะบางครั้งสามารถสร้างรูปขนาดย่อแม้สำหรับไฟล์ที่เสียหาย เช่นหากไฟล์วิดีโอเสียหายเฉพาะตอนท้ายวิธีนี้จะล้มเหลว


0

MediaInfoเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการรับข้อมูลเกี่ยวกับไฟล์วิดีโอใด ๆ ที่คุณต้องการจะโยน นี่อาจเป็นไฮไลต์ข้อมูลที่คุณต้องการ

เครื่องมืออื่นคือGSpotแต่ไม่ได้รับการอัปเดตตั้งแต่ปี 2550

ลองให้ไฟล์ที่รู้จักดีและไม่ดีรู้จักกันและเปรียบเทียบผลลัพธ์

ฉันเคยใช้ GSpot จนกว่าจะหยุดการอัปเดตจากนั้นเปลี่ยนเป็น MediaInfo


1
ฉันมี GSpot รุ่นเก่าบนเครื่องของฉัน ... แต่มันเป็นเครื่องมือสำหรับสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (การกำหนดรหัส / ถอดรหัส ... ) มันไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ ฉันจะตรวจสอบ mediainfo
โกง

GSpot จะรายงานว่าขนาดไฟล์หรือจำนวนเฟรมไม่ตรงกับที่คาดไว้จากดัชนี (ที่ใดที่หนึ่งทางด้านซ้ายมือมันใช้เวลานานแล้วตั้งแต่ฉันใช้มัน!) รวมถึงรุ่นที่ใหม่กว่าที่เพิ่มฟังก์ชันการทำงานมากมาย
Shevek

MediaInfoซ้ำสามารถสแกนไดเรกทอรี: mediainfo *จะได้รับรายงานของไฟล์ทั้งหมดในระดับใดที่เริ่มต้นจากโฟลเดอร์ปัจจุบันเพียงแค่เรียกใช้
ccpizza

1
mediainfoดูเหมือนจะไม่ตรวจสอบความสมบูรณ์ ฉันเอาwebmไฟล์วิดีโอ33 MB truncateมาครึ่งแล้ว mediainfoยังคงมีเกือบเอาท์พุทเดียวกันสำหรับทั้งสองไม่มีสัญญาณที่ชัดเจนของการทุจริต หลังจากtruncateing ถึง 1 MB ก็ยังไม่มีสัญญาณชัดเจนของความเสียหายในผลลัพธ์ เฉพาะในกรณีที่คุณมองลึกลงไปที่ผลลัพธ์มีข้อมูลที่ขัดแย้งกันอยู่บ้าง แต่ส่วนเหล่านี้ขึ้นอยู่กับรูปแบบของไฟล์วิดีโอดังนั้นคุณจึงไม่สามารถตรวจจับนี้ได้โดยอัตโนมัติ
Tino

3
mediainfoไม่อ่านอะไรเลยนอกจากเมทาดาทา สิ่งนี้จะไม่ตรวจสอบความถูกต้องของไฟล์ของคุณไม่ว่าด้วยวิธีใด
DanielSmedegaardBuus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.