mjpeg就是 motion JPEG,是一種影像串流的格式
比較不一樣的地方是它並不像其他壓縮方法需要參考keyframe才能解讀當下的frame
每個frame都是獨立的jpeg檔,也就是都是keyframe,frame跟frame之間沒有任何關聯
所以任何時候拿到frame都可以自己解開,但是缺點就是framesize只取決於jpeg壓縮方法
而跟其他串流格式比較起來更大,所需的bitrate也較高,現在許多usb攝影機都支援這種格式
在這邊要介紹一個方便的streamer
mjpg-streamer: http://sourceforge.net/projects/mjpg-streamer/
它可以從usb camera截取jpg檔來用http串流到網路上或是寫入檔案中
如果想要拿到新版的streamer可以用
svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
來拿到最新版的code,其中mjpg-streamer資料夾就是我們需要的streamer
編譯完後就可以執行以下的命令
./mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www"
他就會開啟一個http server
我們可以借由連到以下的網址來做設定
http://127.0.0.1:8080
或是用 http://127.0.0.1:8080/?action=snapshot 取得截圖
以及用 http://127.0.0.1:8080/?action=streamer 來獲得串流
順帶一提,自從chrome更新到29版之後就不能直接用網頁看串流了
需要寫一個html檔用<video>tag包裝起來看或是直接用vlc播放
除此之外 mjpg-streamer也提供其他的plugin
用法跟種類就自己到plugin資料夾翻翻就知道摟
接著,我參考了網路上的做法用perl寫了一個script
用來抓取mjpg streaming並包成一個avi檔
參考了microsoft的avi riff spec
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318189(v=vs.85).aspx
有空再把程式碼跟comment放上來
最後,本篇許多命令跟網址都是憑著印象打出來的
若有謬誤,只能說聲抱歉拉 XD
可以再留言給我,我再來修改,謝謝
相關網址
http://liangyunzhao.blogspot.tw/2012/04/mjpg-stream.html
http://www.lavrsen.dk/foswiki/bin/view/Motion/PerlParseMJPEGStream
沒有留言:
張貼留言