web-dev-qa-db-ja.com

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

このタイトルは多少誤解を招く可能性があるので、説明しましょう...

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

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

122
Rook

あなたは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
127
whitequark

私は上の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
10
pfalcon

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.batcheckvideo.bat *.avi

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

1

ffmpegを使用してnullフォーマットに変換するというもう1つの答えの問題は、本当に長い時間がかかることです。特に、ディレクトリ内の複数のファイルを確認したい場合は、.

手っ取り早い方法は、すべてのビデオのサムネイルを生成し、サムネイル生成が失敗した場所を確認することです。

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があります。破損したファイルに対してもサムネイルが生成されることがあるため、この方法では誤った結果が生じる可能性があります。例えば。ビデオファイルが最後にしか破損していない場合、このメソッドは失敗します。

1
shivams

MediaInfo は、投げたいビデオファイルに関する情報を取得するための優れたツールです。これはあなたが欲しい情報を強調することができるかもしれません。

他のツールは GSpot ですが、2007年以来更新されていません。

それぞれに既知の良いファイルと既知の悪いファイルを渡して、結果を比較してみてください。

GSpotは、更新が止まるまで使用していたが、その後MediaInfoに切り替えた。

0
Shevek