彭老師在錄制的《物聯網綜合項目實戰》課程中,在web頁面中加入了實時監控攝像頭的功能,特地整理了一篇如何移植視頻流服務器的文章,供大家學習。
一、嵌入式視頻圖像開源庫
在嵌入式系統中,常用的視頻圖像處理開源系統有:luvcview、cheese、motion、mjpg-streamer或者ffmpeg,其中:
?luvcview: 基于V4L2、SDL的程序,支持拍照錄像,參數調節,代碼精簡實用,適合學習V4L2編程
?cheese:基于V4L2、GTK的程序,支持拍照錄像,特殊視頻效果
?motion:移動偵測拍照程序
?mjpg-streamer:網絡攝像機程序
二、mjpg-streamer簡介
MJPG-streamer是一個優秀的開源project,它可以通過HTTP的方式訪問linux上面的兼容攝像頭,從而做到遠程視頻傳輸的效果。
MJPG-streamer從webcam攝像頭采集圖像,把他們以流的形式通過基于ip的網絡傳輸到瀏覽器如Firehox,Cambozola,VLC播放器,Windows的移動設備或者其他擁有瀏覽器的移動設備。
它可以利用某些webcams的硬件壓縮功能來降低服務器CPU的開銷。
它為嵌入式設備和一些常規服務器提供了一個輕量且更少CPU消耗的方案,因為它無需為視頻幀壓縮浪費大量的計算效率。
三、測試攝像頭
![9554a58a-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD7yAdfORAANZbrhPIZ8530.png)
1)按上圖的方式將羅技攝像頭連接入虛擬機
$sudoapt-getupdate
$sudoapt-getinstallcheese
ubuntu 16.04已經自帶該程序
3)測試
攝像頭連接后會生成以下設備文件
root@ubuntu:/home/peng/work#ls/dev/video0-l
crw-rw----+1rootvideo81,0Mar2507:18/dev/video0
運行
root@ubuntu:/home/peng/work#cheese
![9587d248-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD7yAV3gNAAUWVQVoSao290.png)
四、移植
安裝準備:
1. 安裝前準備
sudoapt-getinstalllibsdl1.2-devsubversion
sudoapt-getinstalllibjpeg62-dev
sudoapt-getinstallimagemagick
2. 下載mjpeg-streamer
gitclonehttps://github.com/shrkey/mjpg-streamer
如果沒有安裝git,執行以下命令
sudoapt-getinstallgit
3. 編譯安裝
cdmjpg-streamer/mjpg-streamer
![95bb38fe-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD72ACytJAAEp5GfoKV8627.png)
root@ubuntu:/home/peng/work/camera/mjpg-streamer#tree-L1./
./
├──doc
├──mjpeg-client#分別有linux和windows的客戶端
├──mjpg-streamer#目錄下提供了的執行程序和各個輸入輸出設備組件
├──mjpg-streamer-experimental
├──mjpg-streamer.tar.gz
├──README.md
├──udp_client
└──uvc-streamer#目錄下提供了uvc-streamer的可執行目錄
6directories,2files
ps:重新編譯前,需要執行
make
sudomakeinstall
root@ubuntu:/home/peng/work/camera/mjpg-streamer/mjpg-streamer#makeinstall
install--mode=755mjpg_streamer/usr/local/bin
install--mode=644input_uvc.sooutput_file.sooutput_udp.sooutput_http.soinput_testpicture.soinput_file.so/usr/local/lib/
install--mode=755-d/usr/local/www
install--mode=644-Dwww/*/usr/local/www
![95dd6bd6-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD72ATbqMAAEwxNB4C6o380.png)
編譯生成的庫文件功能
(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圖像存儲到特定的文件夾下,它可以用來抓取圖像。
4 修改腳本
修改腳本文件
/home/peng/work/camera/mjpg-streamer/mjpg-streamer/start.sh
./mjpg_streamer-i"./input_uvc.so-y"-o"./output_http.so-w./www"-o"./output_file.so-f/www/pice-d15000"
![9600b03c-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD72AY6FmAADKyF9LTi0601.png)
"./input_uvc.so-y":指定攝像頭是YUV,默認是JPEG,一口君使用的羅技攝像頭是YUV
"./output_http.so-w./www":指定web服務器根目錄./www,我們可以通過瀏覽器測試攝像頭
"./output_file.so-f/www/pice-d15000":指定拍照保存照片目錄/www/pice,并且每15s保存一次照片
也可以指定分辨率:
./mjpg_streamer-i"input_uvc.so-d/dev/video0-n-y-r640x480-f30"-o"./output_http.so-w./www"-o"./output_file.so-f/www/pice-d15000"
市面上有的攝像頭支持格式有YUV,MJPEG,H264 ;mjpg-stream支持MJPEG和YUV兩種格式
5 測試
運行
./start.sh
(1)網頁測試
(2)網頁視頻流測試
![96333ff2-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD72AWnLhAAXnCz-8CZc516.png)
(3) 拍照功能實現
瀏覽器上地址欄輸入如下內容:
http://127.0.0.1:8080/?action=snapshot
或者
http://127.0.0.1:8080/?action=stream
snapshot 表示每次抓拍一張圖形顯示在網頁上,stream 表示視頻流也就是連續的圖像
6. 補充
一口君還使用了一款z-star攝像頭,該款攝像頭不要添加-y
選項
./mjpg_streamer-i"./input_uvc.so-d/dev/video0"-o"./output_http.so-w./www"-o"./output_file.so-f/www/pice-d150000"
有時候攝像頭生成的設備文件不是/dev/video0
我們需要對應參數:
-d/dev/video1
五、代碼流程
![96ad463a-0c95-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F1/wKgaomTnD76AQDzJAAKJCm_hI2Y923.png)
六、支持單拍、連拍
由于 mjpg_stream 中 output-file.so 能實現連續拍照的功能,不能實現單拍或 連拍幾張的功能所以需要對 output_file 原碼進行修改。修改文件目錄:
peng@ubuntu:~/work/camera/mjpg-streamer/mjpg-streamer/plugins/output_file/output_file.c
- 在 196 行 函數 voidworker_thread(voidarg) 體中加入以下代碼:
charbuf[10];//用于存放從管道讀取的命令
intflags=0;//拍照標志,1:表示11張照片,2:表示1張照片
intfd_com=0;//打開管道的文件描述符
intstop_num=0;//拍照計數
if(access("/tmp/webcom",F_OK)0)//創建有名管道用于接收拍照命令
{
if(mkfifo("/tmp/webcom",0666)0)
{
printf("photofifocreatefailed
");
}
}
fd_com=open("/tmp/webcom",O_RDONLY,0666);
if(fd_com0)
{
perror("openthefilewebcomerror");
}
-
在229行
while( ok >= 0 && !pglobal->stop){
后加入
if(flags==0)
{
while(1)
{
read(fd_com,buf,sizeof(buf));
if(strncmp(buf,"danger",6)==0)//拍11張照片
{
flags=1;
bzero(buf,sizeof(buf));
break;
}
if(strncmp(buf,"one",3)==0)//拍1張照片
{
flags=2;
bzero(buf,sizeof(buf));
break;
}
}
}
- 在355行
355/*ifspecified,waitnow*/
356if(delay>0){
357usleep(1000*delay);
358}
后加入
stop_num++;
if(flags==1)//判斷拍照的數量
{
if(stop_num>9)
{
stop_num=0;
flags=0;
}
}
elseif(flags==2)
{
stop_num=0;
flags=0;
}
審核編輯:湯梓紅
-
嵌入式
+關注
關注
4993文章
18368瀏覽量
290146 -
服務器
+關注
關注
12文章
8192瀏覽量
82746 -
移植
+關注
關注
1文章
367瀏覽量
27874
原文標題:手把手教你ubuntu下移植MJPG-streamer
文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論