ビデオが完全にダウンロードされたかどうかを確認するにはどうすればよいですか?


10

完成した動画かどうかを確認したい動画がたくさんあります。一部は部分的にダウンロードされる場合がありますが、問題はありません。これらのビデオが完全にダウンロードされたかどうかを効率的に確認するにはどうすればよいですか?

リンクがあれば、サイズを確認していましたが、確認していませんでした。

私が使用しようffprobemediainfoffprobeは部分的にダウンロードされたファイルに関する軽微な問題を報告しますが、完全にダウンロードされたファイルのいくつかに関する同様の問題も報告します。ffmpegファイル全体を読み取って動画の長さを比較し、ダウンロードされたかどうかを確認するために使用する必要がありますか?より良い解決策はありますか?


現在ダウンロード中のファイルについて話しているのですか。つまり、ファイルをダウンロードしているプログラムは、より多くのデータを受信するため、ファイルにまだ書き込みを行っていますか?または、過去のある時点でダウンロードが中止されたファイルについて話しているのですか?
Gilles 'SO-悪をやめる'

@Gilles Theは過去にダウンロードされましたが、現在これらのファイルの一部は不完全です。不完全なビデオファイルを見つけたいので、手動でリンクを見つけてダウンロードを再開できます。
Ho1 2016年

@ Ho1私の回答はあなたの質問を満たしましたか?
J363

@ J363ご回答ありがとうございます。私のコメントに返信していただけませんか?
Ho1 2016年

回答:


11

ffmpegOSに依存しないツールで、ビデオファイルが完全にダウンロードされたかどうかを判別できます。以下のコマンド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を使用しました。


1
これは何とか機能しますが、すべてのビデオを処理する必要があります。別の方法として、ビデオをVLCで開くと、末尾近くのどこかをクリックすると、時間がかからず、より実用的であることがわかりました。同様のものをで定義することは可能ffmpegですか?すべてのビデオを処理せずに99%を目指し、エラーなしで正常に機能するかどうかを確認することを意味します。
Ho1 2016年

@ Ho1更新されたコマンドを参照してください。
J363

1
-sseofフラグを使用して、または使用せずに数回テストしたため、コマンドが機能することを確信しています。元のコマンドはファイル全体をチェックします。これは推奨される動作です。要求した修正されたコマンドは、データがファイルの最後からコマンドに欠落しているという仮定を表明していますが、そうではない場合があります。私のテストファイルは、トレントクライアントでダウンロードした137MBのmp4の99.9%です。-sseofフラグを使用して、逆に見える時間を徐々に増やしていくと、最終的に、ファイル全体を検索するコマンドを実行した場合とまったく同じ出力が得られます。
J363

1
-ssおよびを使用すると-sseof、ffmpegはファイル全体を読み取って処理します。とにかく、ビデオをVLCで開いて、最後の方をクリックする方が高速です。
Ho1 2016年

1
あなたは正しいですが、私はhttp経由でダウンロードしています。
Ho1 2016年

7

MediaInfoは次の行を表示します。

Truncated: Yes

ファイルがフォーマット仕様で期待どおりに完成していない場合。

不正に多重化されたファイルと部分的にダウンロードされたファイルとの間に技術的に違いはないため(ファイルの境界に関する仕様を満たしていない)、バグのあるファイルと部分的にダウンロードされたファイルを区別することは技術的に不可能です。

別の(高度な)テストを行うことができます。たとえば、.mp4ファイルのインデックスを読み取り、最後のフレームのファイルオフセット+フレームサイズが、取得したファイルのファイルサイズ内にあることを確認しますが、これは正確には表示されていません。の場合(ソースファイルにポスターなどのメタデータがあり、ファイルの最後にあり、ファイルがこのポスターの直前で切り捨てられている場合でも、すべての場合で部分的なダウンロードが検出されない)。MediaInfoには実装されていませんが、MediaInfo機能リクエストを追加できます。

すべての場合において、すべての部分的なダウンロードを検出することは非常に困難です。これは、合計ファイルサイズがほとんどのビデオファイル形式で示されていないため、ファイルが切り捨てられていることは確認できますが、ファイルが切り捨てられていないことは確認できないためです。完全なファイルをダウンロードしたことを確認する唯一の方法は、他の場所からファイルサイズを取得することです(より良い:MD5などのハッシュを用意する)。

PS:この質問は、オペレーティングシステムに固有のものではありません。


ご回答有難うございます。正確な答えは必要ありません。おおよその答えで十分です。この質問をsuperuser.comに移動する必要があると思いますか?
Ho1 2016年

-f(完全な情報表示)を使用してmediainfoバージョンv0.7.83を使用しても、このようなフィールドを取得できませんでした。Truncatedフィールドを取得するのを手伝っていただけませんか?
Ho1 2016年

ファイルの1バイトを削除するだけで、この「切り捨てられた」フィールドが表示されます(-fは不要で、デフォルトの出力で十分です)。FYIは、今日最もよく使用されている形式であるMP4 / MOV、Matroska、MXFに実装されています。別のフォーマットでテストしていますか?
ジェローム・マルティネス

2
答えてくれてありがとう。一度に多くのファイルをチェックするために、私は以下を使用しました:mediainfo * | grep -E "^(IsTruncated|Complete name)"対応するファイルのファイル名が "IsTruncated:Yes"行の真上に表示されています。
0x01

4

-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つのコア/スレッドのみを使用し、速度が低下します。


これは質問に対する答えを提供しません。十分な評判られると、どの投稿にもコメントできるようになります。代わりに、質問者からの説明を必要としない回答を提供してください。- レビューから
Braiam

@Braiam完全にダウンロードされたファイルは出力を生成せず、不完全なファイルが生成するため、これは質問に答えます。
Jan Ehrhardt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.