2010-01-25 12:54:46 +0000 2010-01-25 12:54:46 +0000
130
130
Advertisement

ビデオファイル(avi、mpeg、mp4...)の整合性をチェックするにはどうすればいいですか?

Advertisement

このタイトルはやや誤解を招く可能性があるので、説明させてください…

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

だから、私は興味があります…ファイルが完全にダウンロードされていることを確保するためにダウンロードの手段(ダウンロードマネージャなど)を使用せずに、どのようにビデオファイルが全体的にダウンロードされ、それが完全であるかどうかを確認することができますか?

Advertisement
Advertisement

回答 (7)

137
137
137
2010-01-25 13:05:22 +0000

あなたは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
14
14
14
2011-09-22 17:05:59 +0000

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
``` 0x1&
1
Advertisement
1
1
2017-08-15 14:13:33 +0000
Advertisement

Windowsの場合、このバットファイルを使用して、現在のフォルダとすべてのサブフォルダの動画の整合性を「バッチ」でチェックすることができます。

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

Use:

checkvideo.bat [filter]

フィルターを1つも指定しないと、「*.mp4」を取得します。

サンプル。checkvideo.batcheckvideo.bat *.avi

Setup: ここからWindows用のFFmpegをダウンロードしてください。 https://ffmpeg.zeranoe.com/builds/ を解凍し、FFmpeg を解凍したパスのバットファイルの中の `C:\ffmpeg\binWindowsの場合、このバットファイルを使用して、現在のフォルダとすべてのサブフォルダの動画の整合性を「バッチ」でチェックすることができます。

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

Use:

checkvideo.bat [filter]

フィルターを1つも指定しないと、「*.mp4」を取得します。

サンプル。checkvideo.batcheckvideo.bat *.avi

Setup: ここからWindows用のFFmpegをダウンロードしてください。[ https://ffmpeg.zeranoe.com/builds/ ]0x3& を解凍し、FFmpeg を解凍したパスのバットファイルの中の を変更する。 パスに含まれるフォルダに checkvideo.bat を置くか、パス環境変数にそのフォルダを追加する。

0
0
0
2020-01-12 11:14:29 +0000

fluent-ffmpeg

var ffmpeg = require('fluent-ffmpeg');
var ff = new ffmpeg();

ff.on('start', function(commandLine) {
  // on start, you can verify the command line to be used
})
.on('progress', function(data) {
  // do something with progress data if you like
})
.on('end', function() {
  // do something when complete
})
.on('error', function(err, stdout, stderr) {
  // handle error conditions
  console.log('Error: ' + err.message)
  console.log('ffmpeg output:\n' + stdout)
  console.log('ffmpeg stderr:\n' + stderr)
})
.addInput('path\to\file')
.addInputOption('-xerror')
.addInputOption('-v error')
.output('-')
.outputOptions('-f null')
.run();

参照: https://stackoverflow.com/questions/43349360/how-to-check-for-corrupted-webm-video-using-node-js-and-fluent-ffmpeg

0
Advertisement
0
0
2019-11-12 09:31:47 +0000
Advertisement

より簡単なバージョン

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done

これは処理中のファイル名を表示します。

error.log はエラーを含みます。

0
0
0
2010-01-25 13:13:15 +0000

MediaInfo ](http://mediainfo.sourceforge.net/) は、任意の動画ファイルの情報を取得するための素晴らしいツールです。これは必要な情報をハイライトすることができるかもしれません。

もう一つのツールは GSpot ですが、2007年から更新されていません。

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

私は更新されなくなるまで GSpot を使っていましたが、その後 MediaInfo に切り替えました。

0
Advertisement
0
0
2018-04-11 12:16:24 +0000
Advertisement

ffmpegを使ってnull形式に再コードする他の回答の問題点は、本当に時間がかかることです。特に、ディレクトリ内の複数のファイルをチェックしたい場合には、時間がかかります。

手っ取り早い方法は、すべての動画のサムネイルを生成して、サムネイル生成に失敗した場所を確認することでしょう。

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;

この方法は他の方法よりもずっと速いことがわかりました。

0x1&

この方法は他の方法よりもずっと速いことがわかりました。なぜなら、破損したファイルでもサムネイルが生成されることがあるからです。例えば、ビデオファイルが最後だけ破損している場合、この方法は失敗します。

Advertisement