1

IP カメラの短いクリップから画像フレームを抽出しようとしています。具体的にはこのクリップ。

http://db.tt/GQwu0nZ8

それで、これでffmpegでそのフレームを抽出しようとしています。

ffmpeg -i M00001.jpg -vcodec mjpeg -f image2 image%03d.jpg

クリップの最初のフレームだけを取得しています。残りのフレームを取得するにはどうすればよいですか? 別のツールを使用してその画像を取得できますか?

ありがとうございました

4

2 に答える 2

1

これは多すぎるかもしれませんが、Node.js https://nodejs.org/の短い JavaScript プログラムを次に示します。これは、読み取り可能なすべてのフレームを取り除き、現在のディレクトリに順番に番号が付けられた個別の jpg ファイルとして保存します。短いビデオ クリップでも何千ものフレームが生成される可能性があり、Node が使用する V8 JavaScript エンジンは非常に高速であるため、ファイル ブラウザーを閉じることをお勧めします。

ビデオ ファイルが大きすぎてバッファを作成できない場合、Node はエラーを発行して終了します。
その場合、最も簡単な方法は、シェル ユーティリティまたは HexEdit などのプログラムを使用してファイルをチャンクに分割することです。 http://www.hexedit.com/

ファイルを非同期で処理するようにこのコードを書き直せば問題は解決しますが、非同期コードを書いても不安が残ります。

var orgFile=process.cwd()+"/"+process.argv[2]; //Grab the video filename from the command line
var fs = require("fs"); //Load the filesystem module
var stats = fs.statSync(orgFile);//Get stats of video file
var fileSizeInBytes = stats["size"];//Get video file size from stats
var fdata=new Buffer(fileSizeInBytes);//Create a new buffer to hold the video data
var i=0;
var fStart=0;
var fStop=0;
var fCount=0;
fdata=fs.readFileSync(orgFile);//Read the video file into the buffer
//This section looks for the markers at the begining and end of each jpg image
//records their positions and then writes them as separate files.
while (i<fileSizeInBytes){

if (fdata[i]==0xFF){
    //console.log("Found FF at "+i.toString);
    if (fdata[i+1]==0xD8){
        //console.log("Found D8 at "+(i+1).toString);

        if (fdata[i+2]==0xFF){
            //console.log("Found FF at "+(i+2).toString);
            fStart=i;
            }
        }
    }
if (fStart>0){
    if (fdata[i]==0xFF){
        if(fdata[i+1]==0xD9){
            fStop=i+1;

        }
    }
if (fStart>0){
    if (fStop>0){
    fCount++;
    fs.writeFileSync(orgFile+"."+fCount.toString()+".jpg",fdata.slice(fStart,fStop));   
    console.log (orgFile+"."+fCount.toString()+".jpg");
    fStart=0;
    fStop=0;
    }
}
}

i++;
}

console.log ("Wrote "+fCount.toString()+" frames.");

上記のコードを mjpeg_parse.js として保存すると、呼び出しの例は次のようになります。

ノード mjepeg_parse.js videofile.avi

于 2016-01-25T20:35:42.763 に答える
0

コマンドはffmpeg問題なく動作しますが、mjpeg ビデオを入力ファイルとして指定する必要があります。M00001.jpgが 1 つの jpg 画像の場合、(同じ) 1 つの出力画像のみが得られます。

于 2012-12-13T13:24:13.490 に答える