Làm cách nào để kiểm tra tính toàn vẹn của tệp video (avi, mpeg, mp4, 59)?


108

Tiêu đề này có thể gây hiểu nhầm, vì vậy hãy để tôi giải thích ...

Tôi đang tải xuống một tệp video ... mpeg, avi - là một trong những định dạng phổ biến. Bây giờ, nếu tôi đang tải xuống và tải xuống bị hỏng ở giữa phần tải xuống ... thì, ví dụ, Windows Media Player sẽ đưa ra một số lỗi và từ chối phát (mặc dù tệp là, giả sử Hoàn thành 98%). Nhưng, những người chơi như KMPlayer hoặc MediaPlayer Classic sẽ chơi nó cho đến thời điểm đó (vì thực tế, họ có thể chơi nó trong khi nó cũng đang được tải xuống).

Vì vậy, tôi quan tâm, ... mà không sử dụng bất kỳ phương tiện tải xuống nào (trình quản lý tải xuống và tương tự) để bảo mật tệp được tải xuống hoàn toàn, làm thế nào để xác minh xem tệp video có được tải xuống toàn bộ hay không và nó đã hoàn tất chưa?


MPEG không đầy đủ nên chơi không có vấn đề. AVI có các chỉ mục để tìm kiếm nhanh ở cuối tệp, một số người chơi sẽ sử dụng và một số không yêu cầu hoặc sẽ bỏ qua.
bobince

6
Incomplete MPEG should play with no problems. @bobince, câu hỏi là / là làm thế nào để kiểm tra tham nhũng, chứ không phải làm thế nào để phát một tệp không đầy đủ. Ngay cả khi một định dạng hỗ trợ phát các tệp không đầy đủ, vẫn có thể kiểm tra tham nhũng nếu tệp không tuân thủ các đặc điểm kỹ thuật định dạng. Ví dụ: bạn vẫn có thể đọc tệp văn bản thuần túy chưa hoàn chỉnh, nhưng bạn vẫn có thể phát hiện xem tệp có vấn đề như nếu nó kết thúc ở giữa câu hoặc có một đoạn thông tin rõ ràng bị thiếu ở giữa.
Synetech

Câu trả lời:


113

Bạn có thể sử dụng một tính năng trong ffmpeg trình chuyển đổi video: nếu bạn sẽ chỉ định nó để mã hóa video thành không có gì thì nó sẽ chỉ đọc tệp đầu vào và báo cáo bất kỳ lỗi nào sẽ xuất hiện. Đây là quá trình rất nhanh vì các khung hình video chỉ đang được đọc, kiểm tra và âm thầm giảm xuống.

Dòng lệnh ví dụ: (dành cho Linux)

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

-v error có nghĩa là nhất định mức độ dài dòng (để hiển thị một số lỗi thường bị ẩn vì chúng không ảnh hưởng nhiều đến khả năng chơi).

Bạn sẽ nhận được một bản ghi lỗi đầy đủ với một số thông tin chung về tệp ffmpeg sẽ xuất ra, vì vậy điều này có thể sẽ cần bạn chú ý, thông qua các bộ lọc có thể được viết để thực hiện kiểm tra hàng loạt các tệp tương tự.

FFmpeg cũng có sẵn cho Windows đây . Dòng lệnh sẽ gần như giống hệt với ngoại lệ của chuyển hướng stderr:

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

5
Cùng tốc độ như thể nó sẽ được chuyển đổi.
Somebody

7
Một lựa chọn khác là ffprobe đi kèm với gói ffmpeg. Nó không thực hiện bất kỳ chuyển đổi nào mà chỉ đọc thông tin siêu dữ liệu từ tệp. Do đó, nó sẽ phát hiện lỗi trong siêu dữ liệu nhưng sẽ không tìm thấy bất kỳ vấn đề nào trong chính tệp. Cá nhân sử dụng ffprobe để xác minh nhanh tải lên trước khi xử lý thêm
mente

1
Có vẻ mất nhiều thời gian để xem phim không may, nhưng có vẻ như nó hoạt động
MattPark

2
Nếu, như OP tuyên bố, "tải xuống bị hỏng ở giữa uhm ... tải xuống", rất có khả năng là tất cả các các luồng sẽ bị gián đoạn, vì vậy bạn có thể phát hiện lỗi này bằng cách hạn chế giải mã chỉ một bản nhạc (sử dụng -map ), sẽ tăng tốc đáng kể hoạt động: ffmpeg -v error -i in.mkv -map 0:1 -f null … Nếu có lỗi, nó sẽ ghi lại vị trí byte mà bạn có thể sử dụng để cắt tệp (một megabyte hoặc hai trước đó để an toàn) và sau đó tiếp tục tải xuống.
Lumi

3
Có thể mất 4 phút rưỡi để tôi kiểm tra tệp .mkv dài 1GB, trên bộ xử lý lõi hex cũ. Tất cả các lõi đã được tối đa trong quá trình thử nghiệm. Tôi hex đã chỉnh sửa một bản sao của tệp và thêm một số khối 00 để mô phỏng thiệt hại. Nhật ký lỗi báo cáo các lỗi chính xác. Các tệp không có lỗi trả về một lỗi trống.log
TripleAntigen

8

Tôi thích ý tưởng sử dụng ffmpeg -f null ở trên, nhưng tôi thực sự muốn tự động hóa quá trình sử dụng đầu ra đó. Cụ thể, kịch bản phổ biến tôi có với bộ sưu tập video âm nhạc của mình là tôi có một vài clip có cùng độ phân giải và tôi muốn ghi nhật ký xác minh khác cho những tệp đó để loại bỏ những tệp bị hỏng nhiều nhất.

Thật không may, ffmpeg cho đến nay không có cách nào để vô hiệu hóa chế độ tương tác của nó, điều này tạo ra tiếng ồn cho trường hợp sử dụng này. Tôi đã kết thúc việc hack tập lệnh bao bọc đơn giản để thực hiện lọc:

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

Ví dụ đầu ra:

[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
nếu bạn làm nó để nó thay thế những phần bị hỏng bằng những phần tốt, điều đó sẽ còn tốt hơn
akostadinov

Tôi đang gặp lỗi khi sử dụng:
Akshit Rewari

2
TracBack (cuộc gọi gần đây nhất vừa qua): Tệp "F: \ filecheck.py", dòng 6, trong & lt; mô-đun & gt; t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2 & gt; & amp; 1'% sys.argv [1]).
Akshit Rewari

1

Vấn đề với câu trả lời khác bằng cách sử dụng ffmpeg để mã hóa lại null định dạng là nó thực sự mất một thời gian dài. Đặc biệt, nếu bạn muốn kiểm tra nhiều tập tin trong một thư mục.

Một cách nhanh chóng sẽ là tạo hình thu nhỏ cho tất cả các video và xem nơi tạo hình thu nhỏ thất bại.

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;

Phương pháp này hóa ra NHANH CHÓNG hơn nhiều so với các phương pháp khác.

Tuy nhiên có một lời cảnh báo. Phương pháp này có thể mang lại kết quả sai, vì đôi khi hình thu nhỏ có thể được tạo ngay cả đối với các tệp bị hỏng. Ví dụ. nếu tập tin video bị hỏng chỉ ở cuối, phương pháp này sẽ thất bại.


0

Thông tin truyền thông là một công cụ tuyệt vời để nhận thông tin về bất kỳ tệp video nào bạn quan tâm để ném vào nó. Điều này có thể có thể làm nổi bật thông tin bạn muốn.

Một công cụ khác là GSpot nhưng nó đã không được cập nhật từ năm 2007.

Hãy thử cung cấp cho mỗi người một tập tin xấu tốt và đã biết và so sánh kết quả.

Tôi đã từng sử dụng GSpot cho đến khi nó ngừng được cập nhật, sau đó chuyển sang MediaInfo


1
Tôi có một số phiên bản cũ của GSpot trên máy của mình ... nhưng nó là một công cụ cho một thứ hoàn toàn khác (xác định mã / giải mã ...). Nó không có gì để làm với điều này. Tôi sẽ kiểm tra mediainfo.
Rook

GSpot sẽ báo cáo nếu kích thước tệp hoặc số lượng khung hình không khớp với dự kiến ​​từ chỉ mục (ở đâu đó ở phía bên trái, đã một thời gian kể từ khi tôi sử dụng nó!), Các phiên bản sau này cũng thêm nhiều chức năng.
Shevek

thông tin truyền thông có thể quét đệ quy các thư mục: để nhận báo cáo về tất cả các tệp ở mọi cấp độ bắt đầu từ thư mục hiện tại chỉ cần chạy mediainfo *.
ccpizza

1
mediainfo Rõ ràng không kiểm tra tính đầy đủ. Tôi lấy 33 MB webm tập tin video và truncate d nó đến một nửa. mediainfo vẫn có đầu ra gần như giống nhau cho cả hai, không có dấu hiệu tham nhũng rõ ràng. Sau truncate ing đến 1 MB vẫn không có dấu hiệu rõ ràng về tham nhũng trong đầu ra. Chỉ khi bạn có một cái nhìn sâu hơn về đầu ra, có một số thông tin mâu thuẫn. Nhưng những phần này phụ thuộc vào định dạng của tệp video, vì vậy bạn không thể tự động hóa phát hiện này.
Tino

2
mediainfo không đọc bất cứ thứ gì ngoài siêu dữ liệu. Điều này sẽ không kiểm tra tính hợp lệ của tệp của bạn dưới bất kỳ hình thức nào.
DanielSmedegaardBuus

0

Đối với cửa sổ, Bạn có thể 'kiểm tra tính toàn vẹn cho các video trên thư mục hiện tại và tất cả các thư mục con với tệp bat này:

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

Sử dụng:

checkvideo.bat [filter]

Nếu bạn không cung cấp một bộ lọc, sẽ nhận được '* .mp4'.

Mẫu: checkvideo.bat checkvideo.bat *.avi

Thiết lập: Tải xuống FFmpeg cho Windows từ đây: https://ffmpeg.zeranoe.com/builds/ và giải nén chúng Thay đổi C:\ffmpeg\bin\ trong tệp bat cho đường dẫn mà bạn đã giải nén ffmpeg Đặt checkvideo.bat trên một thư mục có trong Đường dẫn hoặc thêm thư mục của mình vào biến môi trường Đường dẫn


Juan Antonio Tubío Câu trả lời của tôi đang làm việc để tôi kiểm tra tính toàn vẹn của video. Nhưng làm thế nào tôi có thể đọc tệp nhật ký và phát hiện thời gian video bị hỏng. Đăng nhập ví dụ. [h264 @ 00000173649787c0] giải mã cabac của qscale diff không thành công ở 64 7 [h264 @ 00000173649787c0] khi giải mã MB 64 7, tạm dừng
J.Duck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.