このタイトルはやや誤解を招く恐れがありますので、説明します。
私はビデオファイルをダウンロードしています...mpegやaviなどの人気のあるフォーマットの一つです。ダウンロード中に、ダウンロードが途中で切れてしまった場合、例えば、Windows Media Playerはエラーを出して再生を拒否します(ファイルは98%完了しているとしますが)。しかし、KMPlayerやMediaPlayer Classicのようなプレーヤーは、その時点までは再生できます(実際のところ、ダウンロード中も再生できます)。
そこで、興味があるのですが、ファイルが完全にダウンロードされていることを確認するためのダウンロード手段(ダウンロードマネージャーなど)を使わずに、ビデオファイルが完全にダウンロードされているかどうか、完全であるかどうかをどのようにして確認することができますか?
ビデオコンバータ ffmpeg
の機能を利用することができます。ビデオを何もない状態に再コード化するように指定すると、入力ファイルを読み込んで、現れたエラーを報告します。ビデオフレームはただ読まれ、チェックされ、静かに落とされるだけなので、これは非常に速いプロセスです。
コマンドラインの例。(Linuxの場合)
ffmpeg -v error -i file.avi -f null - 2>error.log
-v error
は特定の レベルの冗長性 を意味します (通常はプレイアビリティにあまり影響しないために隠されているいくつかのエラーを表示します)。
ffmpeg が出力するファイルに関する一般的な情報を含む完全なエラーログが表示されるので、おそらく注意が必要になるでしょう。
FFmpeg は Windows 版もあります ここ。コマンドラインは、標準エラーのリダイレクトを除いて、ほとんど同じです。
ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
上記の 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
MediaInfoは、任意のビデオファイルの情報を取得するための優れたツールです。これを使えば、欲しい情報をハイライトできるかもしれません。
また、GSpotというツールもありますが、2007年から更新されていません。
それぞれに既知の良いファイルと既知の悪いファイルを与えて、結果を比較してみてください。
私はGSpotを使っていましたが、更新されなくなったので、MediaInfoに切り替えました。