題 如何檢查視頻文件的完整性(avi,mpeg,mp4 ......)?


這個標題可能有些誤導,所以讓我解釋一下......

我正在下載一個視頻文件... mpeg,avi - 是一種流行的格式。現在,如果我正在下載它,並且下載中斷了uhm ...下載,那麼,例如,Windows Media Player將發出一些錯誤並拒絕播放它(儘管文件是,比方說, 98%完成)。但是,像KMPlayer或MediaPlayer Classic這樣的玩家會在此之前播放它(事實上,他們也可以在下載時播放它)。

所以,我很感興趣,...沒有使用任何下載方式(下載管理器和類似的)來保護文件是完全下載的,如何驗證視頻文件是否整個下載,並且它是完整的?


100
2018-01-25 12:54


起源


不完整的MPEG應該沒有問題。 AVI在文件末尾有快速搜索的索引,有些玩家會使用這些索引,有些則不需要或將會忽略。 - bobince
Incomplete MPEG should play with no problems. @bobince,問題是/是如何檢查腐敗,而不是如何播放不完整的文件。即使格式支持播放不完整的文件,如果文件不符合格式規範,仍應檢查是否存在損壞。例如,您仍然可以讀取不完整的純文本文件,但您仍然可以檢測文件是否存在問題,例如它是否在句子中間結束,或者中間是否有一大堆明顯丟失的信息。 - Synetech


答案:


您可以使用功能 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

107
2018-01-25 13:05



速度與轉換速度相同。 - Somebody
另一種選擇是 ffprobe 與包裝一起提供 ffmpeg。它不進行任何轉換,只是從文件中讀取元數據信息。因此,它將檢測元數據中的錯誤,但不會在文件本身中發現任何問題。個人使用 ffprobe 在進一步處理之前快速驗證上傳 - mente
不幸的是,只要看電影似乎就可以了,但似乎有效 - MattPark
如果,正如OP所說的那樣,“在中間下載中斷...下載”,很可能就是這樣 所有 流將被中斷,因此您可以通過限制解碼來檢測此錯誤 只有一個音軌 (使用 -map),這將顯著加快操作: ffmpeg -v error -i in.mkv -map 0:1 -f null … 如果出現錯誤,它將記錄字節位置,您可以使用該位置來截斷文件(提前一兆字節或兩兆字節為安全),然後繼續下載。 - Lumi
我花了大約4 1/2分鐘來測試1GB 1小時長的.mkv文件,在一個老式的六核處理器上。在測試期間,所有核心都達到了最大值。我十六進制編輯了該文件的副本,並添加了一些00塊以模擬損壞。錯誤日誌正確報告了錯誤。沒有錯誤的文件返回一個空的error.log - TripleAntigen


我喜歡使用的想法 ffmpeg -f null 上面,但我實際上想要自動化使用該輸出的過程。特別是,我的音樂視頻集合的常見情況是我有幾個具有相同分辨率的剪輯,我想對那些文件進行差異驗證,以刪除最多的文件。

不幸的是,ffmpeg到目前為止還沒有辦法禁用它的交互模式,這種模式會在這種情況下輸出噪音。我最終破解了簡單的包裝腳本來進行過濾:

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

7
2017-09-22 17:05



如果你做它以便用好的零件替換破損的零件,那就更好了 - akostadinov
我用這個收到錯誤: - Akshit Rewari
回溯(最近一次調用最後一次):文件“F:\ filecheck.py”,第6行,在<module> t = os.popen('ffmpeg -v 5 -i“%s”-f null - 2>&1' %sys.argv [1])。read()IndexError:列表索引超出範圍 - Akshit Rewari


媒體信息 是一個很好的工具,可以獲取您關注的任何視頻文件的信息。這可能會突出顯示您想要的信息。

另一個工具是 G點 但它自2007年以來一直沒有更新。

嘗試給每個人一個已知的好的和已知的壞文件並比較結果。

我曾經使用GSpot直到它停止更新,然後切換到MediaInfo


0
2018-01-25 13:13



我的機器上有一些舊版本的GSpot ......但它是一個完全不同的工具(確定代碼/解碼......)。它與此無關。我會查看mediainfo。 - Rook
GSpot將報告文件大小或幀數是否與索引的預期值不匹配(左側的某個地方,自從我使用它以來已經有一段時間了!),後來的版本也添加了很多功能。 - Shevek
媒體信息 可以遞歸掃描目錄:從當前文件夾開始,只需運行任何級別的所有文件的報告 mediainfo *。 - ccpizza
mediainfo 顯然沒有檢查完整性。我拿了33 MB webm 視頻文件和 truncate它到了一半。 mediainfo 兩者的產量幾乎相同,沒有明顯的腐敗跡象。後 truncate在1 MB的情況下,輸出中仍然沒有明顯的腐敗跡象。只有你對輸出有了更深入的了解,才會有一些矛盾的信息。但這些部分取決於視頻文件的格式,因此您無法自動執行此檢測。 - Tino
mediainfo 除了元數據之外什麼都不讀。這不會以任何方式檢查您的文件的有效性。 - DanielSmedegaardBuus


對於Windows,您可以使用此bat文件“批量”檢查當前文件夾和所有子文件夾上的視頻的完整性:

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 for Windows: https://ffmpeg.zeranoe.com/builds/ 並解壓縮它們 更改 C:\ffmpeg\bin\ 在bat文件中,你有解壓縮ffmpeg的路徑 放 checkvideo.bat在Path中包含的文件夾上或將其文件夾添加到Path環境變量中


0
2017-08-15 14:13



JuanAntonioTubío我的回答是讓我檢查視頻的完整性。但是如何讀取日誌文件並檢測視頻損壞的時間。記錄示例。 [h264 @ 00000173649787c0] qscale diff的cabac解碼在64 7 [h264 @ 00000173649787c0]錯誤時失敗,同時解碼MB 64 7,字節流38638 - J.Duck


使用其他答案的問題 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;

事實證明這種方法比其他方法更快。

但是,有一個CAVEAT。此方法可能會產生錯誤的結果,因為有時甚至可以為損壞的文件生成縮略圖。例如。如果視頻文件僅在最後被破壞,則此方法將失敗。


0
2018-04-11 12:16