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