今天來介紹一個解決方案MJPG-Streamer。MJPG-Streamer的原理是將USB攝像頭采集的圖像以JPEG格式發送出去,然后持續更新圖片形成一個視頻流。
它的優勢有兩個: 一個是和瀏覽器的兼容性最好,可以輕松地在瀏覽器中顯示,而無需擔心瀏覽器是否支持Flash或流媒體協議;二是采用JPEG沒有前后幀的關聯,所以如果出現丟包只影響當前畫面,而不會像H.264那樣可能連續一段時間的馬賽克圖像。
當然也有缺點: 它的缺點是JPEG流的壓縮效率比較低,比H.264浪費帶寬。
二. Libjpeg庫的編譯 MJPG-Streamer要用到libjpeg,所以首先需要編譯libjpeg。首先訪問http://www.ijg.org/下載源代碼,我使用的是最新的9e版本。將源代碼解壓到jpeg-9e目錄后,在該命令下執行configure命令進行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/
其中的host是指明所使用的編譯器,prefix是指定編譯后文件安裝的目錄。 然后執行下面的命令: 1 make 2 make install
命令執行完畢,就會在prefix所指定的目錄下生成4個目錄,其中include目錄包括所需要的頭文件,而lib目錄下包括庫文件。這些在后面會用到。
編譯后需要把libjpeg.so.9.5.0拷貝到開發板的 /usr/lib 目錄下,并建立一個指向該文件的軟連接libjpeg.so.9。
另外,開發板原來帶有libjpeg.so.8.0.2這個版本。如果不希望安裝更新版本,也可以在http://www.ijg.org/files/下載和板子對應的歷史版本。
三. MJPG-Streamer的編譯 MJPG-Streamer有兩個主要版本(建議在PC打開鏈接): 1.http://sourceforge.net/projects/mjpg-streamer/這個是原始版本,不過原作者已經放棄更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 這個是后續更新的版本。
要在飛凌嵌入式OKA40i-C開發板上使用,只能使用sourceforge那個版本。因為github的版本雖然更新,但是它對內核的版本有要求,至少3.18以上。
OKA40i-C開發板提供的內核版本是3.10,無法正確處理新版本的某些V4L2消息。另外,github版本采用CMake進行編譯,后面所介紹的編譯方法也不適用。
進入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 點右上的“Download Snapshot”下載最新版的mjpg-streamer-code-182。這里可以看到兩個mjpg-streamer目錄。一般使用mjpg-streamer-experimental這個版本,它支持的功能更多一些。
在編譯之前,需要先修改plugins/input_uvc目錄下的makefile文件,在其中加入如下兩行:
這兩行的作用就是編譯時能夠找到我們前面生成的libjpeg庫。如果想修改MJPG-Streamer的插件設置,也可以修改mjpg-streamer-experimental目錄下的makefile:
在本次測試中用不到其他插件,所以就采用默認配置。 然后在命令行執行下面的命令就可以編譯了。 1 make CC=arm-linux-gnueabihf-gcc
編譯成功后把mjpg_streamer和幾個so文件都拷貝到開發板上并正確設置好權限就可以運行了。
四. 測試結果 在input_testpicture插件中帶有一幅默認圖片,即使你手上沒有攝像頭,也可以使用該插件測試MJPG-Streamer的功能。 在開發板的終端輸入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so"
如果使用USB攝像頭,需要使用input_uvc.so插件,在開發板的終端輸入命令,結果如下圖所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so"
|