2012-12-13 153 views
0

我試圖從IP攝像機的短片中提取圖像幀。特別是這個剪輯。從MJPG文件中提取圖像幀

http://db.tt/GQwu0nZ8 

所以,我試圖用這個ffmpeg提取幀。

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

我只是得到剪輯的第一幀。我怎樣才能得到其餘的幀?我可以使用其他工具來獲取該圖像嗎?

謝謝

+0

你可以用我的圖書館,可能是更好的那麼HTTP由於各種原因抓取幀......如果攝像頭支持RTP或RTSP https://net7mma.codeplex.com/ – Jay

回答

0

ffmpeg命令工作正常,但你需要指定MJPEG視頻作爲輸入文件。如果M00001.jpg是單個jpg圖像,那麼您將只獲得一個(相同)輸出圖像。

+0

實際上,IP攝像頭會將該圖像作爲mjpg視頻返回。使用製造商的軟件,您可以看到生成的圖像是一個視頻。 – edsonlp1

+0

@ edsonlp1正如我所看到的,它是由Mobotix相機生成的MxPEG格式。你是如何得到這個圖像的?你可以通過url http:// /cgi-bin/faststream.jpg'訪問mjpeg流嗎?如果是這樣,你可以嘗試將這個URL傳遞給ffmpeg作爲輸入。不幸的是,我無法用ffmpeg解碼實時MxPEG流。但它可以輕鬆解碼流的下載部分(例如使用'wget'http:// /cgi-bin/faststream.jpg''下載)。 – user1871166

+0

我從相機的存儲器中獲取該圖像。你如何提取信息並知道它是MxPEG格式?通過網址的流不適用於我,因爲我需要圖像上的最高質量和分辨率。謝謝 – edsonlp1

0

這可能太多了,但這裏是一個簡短的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