複数の動画がありますが、動画が完成したことを確認したいと思います。その一部は部分的にダウンロードできますが、バグはありません。これらのビデオが完全にダウンロードされたことを効果的に確認するには?
リンクがあればサイズを確認しますが、そうではありません。
私はとffprobe
を試してみましたmediainfo
。ffprobe
部分的にダウンロードしたファイルのマイナーな問題を報告しますが、完全にダウンロードしたファイルのいくつかの同様の問題も報告します。ffmpeg
ファイル全体を読み、ビデオの長さを比較してダウンロードされたことを確認する必要がありますか?より良い解決策はありますか?
答え1
ffmpeg
ビデオファイルが完全にダウンロードされたことを確認するオペレーティングシステムに依存しないツールです。以下のコマンドは、ffmpeg
入力ビデオを読み取り、ビデオをnullにエンコードするように指示します。エンコード中にエラー(フレーム削除など)がtest.logに出力されます。
ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log
ビデオファイルが完全にダウンロードされない場合は、test.logファイルに多くの行があります。たとえば、ビデオファイルに0.1MBがないと、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を使用しました。
答え2
メディア情報行を表示します。
Truncated: Yes
フォーマット仕様に従ってファイルが期待どおりに完成していない場合。
間違った(非互換ファイル境界仕様)混合ファイルと部分的にダウンロードされたファイルは技術的に違いがないため、誤ったファイルと部分的にダウンロードされたファイルを区別することは技術的に不可能です。
.mp4ファイルのインデックスを読み取り、最後のフレームのファイルオフセット+フレームサイズがインポートするファイルのファイルサイズ内にあることを確認するなど、別の(高度な)テストを実行できますが、これはまったく望ましくありません。 (ポスターなど、ファイルの末尾にソースファイルにメタデータが含まれていて、そのポスターの前にファイルが切り捨てられている場合、部分的なダウンロードはまだ各場合には検出されません。)MediaInfoには実装されていませんが、追加できます。MediaInfo機能要求。
すべての場合において、ほとんどのビデオファイル形式にはフルファイルサイズが表示されないため、すべての部分ダウンロードを検出することは困難です。したがって、ファイルが切り捨てられたとは確信できますが、ファイルが切り捨てられていないことはわかりません。ファイル全体がダウンロードされたことを確認する唯一の方法は、他の場所からファイルサイズを取得することです(より良い方法:MD5のようなハッシュを持つこと)。
PS:この質問はオペレーティングシステムに限定されません。
答え3
-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つのコア/スレッドのみが使用されるため、速度が遅くなります。