ビデオファイル(avi、mpeg、mp4…)の整合性を確認するにはどうすればよいですか?


126

このタイトルはやや誤解を招く可能性があるため、説明させてください...

私はビデオファイルをダウンロードしています... mpeg、avi-人気のあるフォーマットの1つです。今、私がそれをダウンロードしていて、ダウンロードがuhm ...ダウンロードの途中で中断した場合、たとえば、Windows Media Playerはいくつかのエラーを出し、それを再生することを拒否します(ファイルはそうですが、 98%完了)。ただし、KMPlayerやMediaPlayer Classicなどのプレーヤーは、その時点まで再生します(実際、ダウンロード中に再生することもできます)。

だから、私は興味があります...ダウンロードの手段(ダウンロードマネージャーなど)を使用せずにファイルが完全にダウンロードされるのを保護するために、ビデオファイルが完全にダウンロードされているかどうか、そしてそれが完全であることを確認するにはどうすればよいですか?


不完全なMPEGは問題なく再生できます。AVIには、ファイルの最後にすばやくシークするためのインデックスがあり、一部のプレーヤーはこれを使用し、一部のプレーヤーはそれを必要としないか無視します。
ボビンス

7
Incomplete MPEG should play with no problems.@bobinceの質問は、不完全なファイルを再生する方法ではなく、破損をチェックする方法でした。フォーマットが不完全なファイルの再生をサポートしている場合でも、ファイルがフォーマット仕様に準拠していない場合、破損をチェックすることが可能です。たとえば、まだ不完全なプレーンテキストファイルを読むことはできますが、ファイルの途中で文の途中で終了したり、明らかに欠落している情報の塊があるなどの問題があるかどうかは検出できます。
Synetech 14年

回答:


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して、さらに処理する前にアップロードの高速検証を行う
メンテ

1
残念ながら映画を見る限りは時間がかかるようですが、うまくいくようです
-MattPark

3
OPが「ダウンロードがuhm ... downloadの途中で中断する」と述べている場合、すべてのストリームが中断される可能性が高いため、デコードを1つのオーディオトラックに制限することでこのエラーを検出できます(を使用-map)。操作が大幅に高速化されます。ffmpeg -v error -i in.mkv -map 0:1 -f null …エラーがある場合は、バイト位置をログに記録します。これを使用して、ファイルを切り捨て(安全のために1〜2メガバイト)、ダウンロードを再開します。
ルミ

3
古いGBの16進コアプロセッサで、1 GBの1時間の.mkvファイルをテストするのに4分半かかりました。すべてのコアはテスト中に最大化されました。ファイルのコピーを16進数で編集し、損傷をシミュレートするために00のブロックをいくつか追加しました。エラーログはエラーを正しく報告しました。エラーのないファイルは、空のerror.logに返さ
TripleAntigen

12

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

1
壊れた部品を良い部品に置き換えるように作れば、それはさらに良いだろう
akostadinov

:私はこの使用して、エラーを取得しています
Akshitレワリ

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では、この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]

1つのフィルターを指定しない場合、「*。mp4」が取得されます。

サンプル: checkvideo.bat checkvideo.bat *.avi

セットアップ: Windows用FFmpegをここからダウンロードします:https : C:\ffmpeg\bin\//ffmpeg.zeranoe.com/builds/解凍ffmpegを解凍したパスのbatファイルを変更しますパスにcheckvideo.bat含まれるフォルダーに置くか、フォルダーを追加しますパス環境変数


Juan AntonioTubíoの答えは、ビデオの整合性をチェックするために働いています。しかし、どうすればログファイルを読み取り、ビデオが破損している時間を検出できますか。ログの例。[h264 @ 00000173649787c0] q64 diffのcabacデコードが64 7で失敗しました[h264 @ 00000173649787c0] MB 64 7のデコード中にエラーが発生しましたバイトストリーム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は、好きな動画ファイルに関する情報を取得するための優れたツールです。これにより、必要な情報を強調表示できる場合があります。

もう1つのツールはGSpotですが、2007年以降更新されていません。

それぞれに既知の良好なファイルと既知の不良なファイルを与えて、結果を比較してみてください。

更新が停止するまでGSpotを使用してから、MediaInfoに切り替えました


1
私のマシンには古いバージョンのGSpotがあります...しかし、それは完全に異なる(コード/デコードを決定する...)ためのツールです。これとは何の関係もありません。mediainfoをチェックします。
ルーク

GSpotは、ファイルサイズまたはフレームカウントがインデックスから予想されるものと一致しない場合(左側のどこか、使用してからしばらく経っています!)、さらに後のバージョンでは多くの機能が追加されたことを報告します。
シェベック

mediainfoは、ディレクトリを再帰的にスキャンできますmediainfo *。現在のフォルダーから始まる任意のレベルのすべてのファイルのレポートを取得するには、単に実行します。
ccpizza

1
mediainfo明らかに完全性をチェックしません。33 MBのwebmビデオファイルを取り、truncateそれを半分にした。 mediainfoまだ両方の出力がほぼ同じで、明らかな破損の兆候はありませんでした。truncate1 MBにした後でも、出力に明らかな破損の兆候はありませんでした。出力をさらに詳しく調べた場合にのみ、いくつかの矛盾する情報がありました。ただし、これらの部分はビデオファイルの形式に依存するため、この検出を自動化することはできません。
ティノ

3
mediainfoメタデータ以外は何も読み取りません。これにより、ファイルの有効性がまったく確認されることはありません。
DanielSmedegaardBuus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.