我試圖從IP攝像機的短片中提取圖像幀。特別是這個剪輯。從MJPG文件中提取圖像幀
http://db.tt/GQwu0nZ8
所以,我試圖用這個ffmpeg提取幀。
ffmpeg -i M00001.jpg -vcodec mjpeg -f image2 image%03d.jpg
我只是得到剪輯的第一幀。我怎樣才能得到其餘的幀?我可以使用其他工具來獲取該圖像嗎?
謝謝
我試圖從IP攝像機的短片中提取圖像幀。特別是這個剪輯。從MJPG文件中提取圖像幀
http://db.tt/GQwu0nZ8
所以,我試圖用這個ffmpeg提取幀。
ffmpeg -i M00001.jpg -vcodec mjpeg -f image2 image%03d.jpg
我只是得到剪輯的第一幀。我怎樣才能得到其餘的幀?我可以使用其他工具來獲取該圖像嗎?
謝謝
與ffmpeg
命令工作正常,但你需要指定MJPEG視頻作爲輸入文件。如果M00001.jpg
是單個jpg圖像,那麼您將只獲得一個(相同)輸出圖像。
實際上,IP攝像頭會將該圖像作爲mjpg視頻返回。使用製造商的軟件,您可以看到生成的圖像是一個視頻。 – edsonlp1
@ edsonlp1正如我所看到的,它是由Mobotix相機生成的MxPEG格式。你是如何得到這個圖像的?你可以通過url http://
我從相機的存儲器中獲取該圖像。你如何提取信息並知道它是MxPEG格式?通過網址的流不適用於我,因爲我需要圖像上的最高質量和分辨率。謝謝 – edsonlp1
這可能太多了,但這裏是一個簡短的JavaScript程序Node.js https://nodejs.org/,將刪除所有可讀幀,並將它們保存爲當前目錄中單獨的按順序編號的jpg文件。請注意,即使是一個短視頻片段也能生成數千幀,並且Node使用的V8 JavaScript引擎速度非常快,所以我建議關閉文件瀏覽器,因爲它會耗費資源以保持速度。
如果視頻文件太大而無法創建緩衝區,Node會發出錯誤並退出。
在這種情況下,最容易做的事情就是將文件拆分爲您的shell實用程序或像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
你可以用我的圖書館,可能是更好的那麼HTTP由於各種原因抓取幀......如果攝像頭支持RTP或RTSP https://net7mma.codeplex.com/ – Jay