動画がたくさんあり、それらが完全かどうかを確認したい。一部は部分的にダウンロードされている可能性がありますが、問題はありません。これらのビデオが完全にダウンロードされたかどうかを効率的に確認するにはどうすればよいですか?
リンクがあれば、サイズを確認したはずですが、確認していません。
ffprobe
とmediainfo
を使用してみました。 ffprobe
は、部分的にダウンロードされたファイルに関する小さな問題を報告しますが、完全にダウンロードされたファイルのいくつかに関する同様の問題も報告します。 ffmpeg
を使用してファイル全体を読み取り、動画の長さを比較して、ダウンロードされたかどうかを確認する必要がありますか?より良い解決策はありますか?
ffmpeg
は、ビデオファイルが完全にダウンロードされたかどうかを判別できる、OSに依存しないツールです。以下のコマンドは、ffmpeg
に入力ビデオを読み取り、ビデオを何もエンコードしないように指示します。エンコードプロセス中に、フレームの欠落などのエラーがtest.logに出力されます。
ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log
ビデオファイルが完全にダウンロードされない場合、test.logファイルに多数の行が含まれます。たとえば、ビデオファイルから.1 MBが欠落すると、71行のエラーが発生しました。ビデオが完全にダウンロードされ、破損していない場合、エラーは検出されず、test.logに出力される行もありません。
編集
上記の例では、ダウンロードしたテストビデオが急流であり、ファイル全体でチャンクが欠落している可能性があるため、ファイル全体をテストしました。
引数のリストに-sseof -60
を追加すると、ファイルの最後の60秒間がチェックされ、かなり高速になります。
ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log
新しいバージョンのffmpegが必要です。2.8にはsseofフラグがないため、3.0を使用しました。
MediaInfo は行を表示します:
Truncated: Yes
ファイルがフォーマット仕様で期待どおりに完成していない場合。
不正に多重化されたファイルと部分的にダウンロードされたファイルとの間に技術的に違いはないため(ファイル境界に関する仕様を満たしていない)、バグのあるファイルと部分的にダウンロードされたファイルを区別することは技術的に不可能です。
別の(高度な)テストを行うことができます。 .mp4ファイルのインデックスを読み取り、最後のフレームのファイルオフセット+フレームサイズが取得したファイルのサイズ内にあることを確認しますが、探しているものとは異なります(ポスターなどのメタデータがある場合)ソースファイル、ファイルの末尾、およびファイルがこのポスターの直前で切り捨てられている場合、部分的なダウンロードは依然としてすべての場合に検出されません)。 MediaInfoには実装されていませんが、 MediaInfo機能リクエスト を追加できます。
すべての場合において、すべての部分的なダウンロードを検出することは非常に困難です。これは、合計ファイルサイズがほとんどのビデオファイル形式で示されていないため、ファイルが切り捨てられていることは確認できますが、ファイルが切り捨てられていないことは確認できないためです。完全なファイルをダウンロードしたことを確認する唯一の方法は、他の場所からファイルサイズを取得することです(より良いのは、MD5などのハッシュを用意することです)。
PS:この質問は、オペレーティングシステムに固有のものではありません。
-sseof -60を指定したffmpeg(v3.1.1)で警告が表示されず、問題があることを示さずに終了したファイルがありました。 Mediainfoは、ファイルが切り捨てられたことも示しませんでした。 -sseof -60を省略した場合のみ、ffmpegでエラーが報告されます。それで私はffprobeを試すことに戻りました。 ffmpegよりも少し速いようです。
ffprobe -v error -count_frames -i filename.mp4
この出力を生成しました
[h264 @ 00000000004e6a60] Invalid NAL unit size.
[h264 @ 00000000004e6a60] Error splitting the input into NAL units.
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004e5280] stream 1, offset 0x1350135: partial file
(OPから報告されたように)まだ誤検知は発生していません。
編集:ffprobeは、テストファイルでffmpegよりも約10%高速でしたが、オプション '-threads 0'ですべてのコアを使用するように指示した場合のみです。それ以外の場合は、1つのコア/スレッドのみを使用し、速度が低下します。