天天看點

mjpg-streamer學習筆記1----mjpg-streamer移植

1、什麼是mjpg-streamer

  MJPG-streamer是一款免費基于IP位址的視訊流伺服器,它的輸入插件從攝像頭讀取視訊資料,這個輸入插件産生視訊資料并将視訊資料複制到記憶體中,它有多個輸出插件将這些視訊資料經過處理,其中最重要的輸出插件是網站伺服器插件,它将視訊資料傳送到使用者浏覽器中,MJPG-streamer的工作就是将其中的一個輸入插件和多個輸出插件綁定在一起,所有的工作都是通過它的各個插件完成的。

各個檔案如下:

    (1)input_testpicture.so。這是一個圖像測試插件,它将預設好的圖像編譯成一個頭檔案,可以在沒有攝像頭的情況下傳輸圖像,進而友善調試程式。

    (2)input_uvc.so。此檔案調用USB攝像頭驅動程式V4L2,從攝像頭讀取視訊資料。

    (3)input_control.so。這個檔案實作對攝像頭轉動的控制接口。

    (4)output_http.so。這是一個功能齊全的網站伺服器,它不僅可以從單一檔案夾中處理檔案,還可以執行一定的指令,它可以從輸入插件中處理一幅圖像,也可以将輸入插件的視訊檔案根據現有M-JPEG标準以HTTP視訊資料服務流形式輸出。

(5)output_file.so。這個插件的功能是将輸入插件的JPEG圖像存儲到特定的檔案夾下,它可以用來抓取圖像。

2、如何将mjpg-streamer移植到開發闆上

(1)  libjpeg 的移植(因為MJPG-streamer依賴于jpeg庫)

解壓libjpeg庫

tar xzvf libjpeg-turbo-1.2.1.tar.gz

切換到libjpeg庫目錄下

cd libjpeg-turbo-1.2.1

建目錄tmp

mkdir tmp

 ./configure --host=arm-linux --prefix=$(pwd)/_install的含義

$ ./configure 下面兩個都是運作configure時給的參數

--host=arm-linux 運作環境 (交叉編譯成arm)

--prefix=$(pwd)/_install 安裝目錄

pwd是目前使用者目錄。

進行配置,--prefix=是指定安裝目錄/work/nfs_root/libpeg-turbo-1.2.1/tmp,--host=arm-linux是指定運作環境是arm

./configure --prefix=/work/nfs_root/libjpeg-turbo-1.2.1/tmp --host=arm-linux

編譯

make

安裝

make install

把/work/nfs_root/libjpeg-turbo-1.2.1/tmp/lib/目錄下的動态庫拷貝到/work/nfs_root/fs_mini_mdev_new/lib/目錄下(-d表示原來是連結檔案也作為連結檔案拷貝過去)

cp /work/nfs_root/libjpeg-turbo-1.2.1/tmp/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib/ -d

(2)  mjpg-streamer 的移植:

解壓

tar xvf mjpg-streamer-r63.tar.gz

切換到mjpg-streamer-r63目錄下

cd mjpg-streamer-r63

修改所有的Makefile 

arm-linux-gcc是交叉編譯工具鍊,用于 編譯出能在ARM平台上運作的程式,而gcc編譯出來的程式在x86平台上運作 

--(1) 将 CC=gcc 修改為 CC=arm-linux-gcc 

--(2) 修改plugins/input_uvc/Makfile 

-O2是優化選項,-DLINUX -D_GNU_SOURCE,-Wall表示打開所有需要注意的警告資訊,-shared指定生成動态連接配接庫,-fPIC 表示編譯為位置獨立的代碼,

 -I/work/nfs_root/libjpeg-turbo-1.2.1/tmp/include 表示指定所需要的頭檔案

a. 将 

CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC 

改為 

CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /work/nfs_root/libjpeg-turbo-1.2.1/tmp/include 

注意: 

-I /work/jz2440/libjpeg-turbo-1.2.1/tmp/include    //  是編譯libjpeg 生成的檔案 

o: 編譯的目标檔案
a: 靜态庫,其實就是把若幹o檔案打了個包
so: 動态連結庫(共享庫)
lo: 使用libtool編譯出的目标檔案,其實就是在o檔案中添加了一些資訊
la: 使用libtool編譯出的庫檔案,其實是個文本檔案,記錄同名動态庫和靜态庫的相關資訊      

[email protected]目标檔案,$^--所有的依賴檔案,$<--第一個依賴檔案。

-L.:表示要連接配接的庫在目前目錄中

-ltest:編譯器查找動态連接配接庫時有隐含的命名規則,即在給出的名字前面加上lib,後面加上.so來确定庫的名稱,即libtest.so

b. 将 

input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo 

                $(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo  

jpeg_utils.lo dynctrl.lo 

改為 

input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo 

                $(CC) $(CFLAGS) -ljpeg -L /work/jz2440/libjpeg-turbo-1.2.1/tmp/lib -o 

$@ input_uvc.c v4l2uvc.lo j peg_utils.lo dynctrl.lo

編譯

make

把 mjpg_streamer /work/nfs_root/fs_mini_mdev_new/bin/目錄下的動态庫檔案拷貝到/work/nfs_root/fs_mini_mdev_new/lib/ 目錄下

cp mjpg_streamer /work/nfs_root/fs_mini_mdev_new/bin/

cp *so* /work/nfs_root/fs_mini_mdev_new/lib/ -d

mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -w www"

3、指令參數

     這個是我設定的參數:輸入UVC,網頁輸出,圖檔輸出(更詳細的設定,建議去看源碼)

         mjpg_streamer -i "input_uvc.so -f 10 -r 320*240 -y" -o "output_http.so -c "ruoyun:liufeng" -w www -p 8888" -o "output_file.so -d 1000 -f /mnt "  

      -i 輸入

       "input_uvc.so -f 10 -r 320*240 -y"

       input_uvc.so:UVC輸入元件

     -f  10             :表示10幀

     -r 320*240     :分辨率

     -y                   :YUV格式輸入(有卡頓),不加表示MJPG輸入(需要攝像頭支援)

      -o輸出

          "output_http.so -c "ruoyun:liufeng" -w www -p 8888" 

          output_http.so          :網頁輸出元件

          -c "ruoyun:liufeng"       :使用者名:ruoyun        密碼:liufeng

          -w www                                  : 網頁輸出

         -p 8888                                   :端口   8888

         "output_file.so -d 1000 -f /mnt "   

          output_file.so                  :圖檔輸出元件

          -d 1000                                   : 時間1S

          -f /mnt                                       :輸出圖檔放在哪,我是開機直接把/mnu挂載到本地檔案夾了

4、使用

在firefox浏覽器裡面輸入 http://192.168.1.1:8080/?action=stream ,應該能看到攝像頭抓取的視訊。

動态視訊:192.168.1.1:8080/?action=stream                

靜态圖像:192.168.1.1:8080/?action=snapshot