久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > mjpg-streamer網絡視頻服務器移植

mjpg-streamer網絡視(shi)頻服務器移植 時間(jian):2017-11-14      來源:未知

MJPG簡(jian)介(jie):

MJPG是MJPEG的(de)縮寫(xie),但(dan)是MJPEG還(huan)可以表示文件格式擴展名(ming).全名(ming)為(wei) "Motion Joint Photographic Experts Group",是一種視頻編碼格式,Motion JPEG技(ji)術常用與(yu)閉合(he)電路的(de)電視攝(she)像機的(de)模擬視頻信(xin)號“翻譯”成視頻流,并存儲在硬盤上。

典型的應用如(ru)數(shu)字視頻記錄器等。MJPEG不像MPEG,不使(shi)用幀間編碼,因此(ci)用一個非線性(xing)編輯器就(jiu)很容(rong)易編輯。

MJPEG的壓縮算法與MPEG一(yi)脈相承,功能很強大,能發送高質圖片,生成完全動畫(hua)視頻等。

但相應地,MJPEG對帶寬(kuan)的(de)要求(qiu)也很高,相當于T-1,MJPEG信息是存儲(chu)在數字媒(mei)體中的(de)龐(pang)然(ran)大(da)物(wu),需要大(da)量(liang)的(de)存儲(chu)空間以滿足如今(jin)多數用戶的(de)需求(qiu)。

因此(ci)從(cong)另一個角度說,在某些條(tiao)件(jian)下(xia),MJPEG也(ye)許是效(xiao)率(lv)低(di)的編碼(ma)/解碼(ma)器之一。

MJPEG 是(shi) 24-bit 的(de) "true-color" 影(ying)像(xiang)標準,MJPEG 的(de)工作是(shi)將 RGB 格式(shi)的(de)影(ying)像(xiang)轉換成 YCrCB 格式(shi),目(mu)的(de)是(shi)為(wei)了減少(shao)檔(dang)案(an)大小,一(yi)般約可減少(shao) 1/3 ~ 1/2 左右。

MJPEG與MJPG的(de)區別(bie):

1、mjpeg是視(shi)頻,就是由系(xi)列jpg圖片組(zu)成(cheng)的視(shi)頻。

 2、MJPG是MJPEG的(de)縮寫,但是MJPEG還可以表(biao)示(shi)文件格式擴展(zhan)名.

一、環境

主(zhu)機環境:ubuntu 12.04.4 LTS

        目(mu)標機:Cortex-A9

        主機工具(ju)鏈(lian):gcc-4.6.4

     ;   交叉工(gong)具鏈:arm-none-linux-gnueabi-

        攝像(xiang)頭:ZC301

 

二、移植過程

1、配置內核是(shi)內核支持(chi)芯片(pian)為ZC301的攝像頭

        Make menuconfig

                Device Drivers ---> 

                        <*> Multimedia support --->

              &nbsp;                 <*> Video For linux 

                                [*] Enable Video For Linux API 1 (DEPRECATED) (NEW)

                      &nbsp;         [*] Video capture adapters (NEW) --->

                    &nbsp;                   [*] V4L USB devices (NEW) ---> 

          &nbsp;                                     <*> USB Video Class (UVC) 

      &nbsp;       &nbsp;                                 [*] UVC input events device support (NEW)

                              &nbsp;         <*> USB ZC0301[P] webcam support (DEPRECATED)

2、重新編譯內核(he)

make uImage

通(tong)過(guo)上面兩個步驟就可以驅動我們的攝(she)像(xiang)頭了(le)。但是這個驅動是基于(yu)V4l2的。以前基于(yu)V4L的一些上層應用就不(bu)能用了(le),或需(xu)要做大量的修改(gai)!

這里我們要實現網絡(luo)視頻的(de)功能,以前(qian)都是(shi)(shi)用(yong)servfox這個(ge)(ge)網絡(luo)視頻服(fu)務器,但是(shi)(shi)這個(ge)(ge)服(fu)務器就(jiu)是(shi)(shi)基于V4L的(de),

我(wo)們如果想用的話就(jiu)得對servfox的源碼進(jin)行修改。這(zhe)里我(wo)們選用另(ling)外一種方案mjpg-streamer。

 

 

(2)mjpg-stream的移植

       &nbsp; 1)mjpg-stream源碼包通過(guo)下面這個網(wang)址下載(zai)

//sourceforge.net/projects/mjpg-streamer/ 打開稍等一下,在Browse All Files上會出現源碼的下載

2)解(jie)壓源碼

tar xvf mjpg-streamer-r63.tar.gz

3)修改源碼

cd mjpg-streamer-r63

修改頂層makefile及plugins目錄(lu)中(zhong)的各級makefile將所有

修改

CC = gcc

CC = arm-cortex_a8-linux-gnueabi

4)*/修改plugins/input_uvc/Makfile

   在(zai)第 16 行(xing)添(tian)加編譯(yi)時需要的 jpeg 頭(tou)文件的路徑(jing)

 CFLAGS += -I /home/david/Exynos4412/test/mjpg-streamer/jpeg /include

在第 24 行添加編譯(yi)時需(xu)要的(de) jpeg 庫的(de)路徑

修改

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

$(CC) $(CFLAGS) -ljpeg -L /home/david/Exynos4412/test/mjpg-streamer/jpeg /lib -o $@

input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

5)修改 plugins/input_uvc/v4l2uvc.c

這個目(mu)錄是(shi)支持 uvc 攝像(xiang)頭(tou)的,而我們的 FS4412 的攝像(xiang)頭(tou)使用的 samsung 的 FIMC

架構,所有(you)在應(ying)用程序(xu)編程時有(you)點(dian)細微差(cha)別,這(zhe)里需要針對(dui)這(zhe)些差(cha)別做一些改動:

修(xiu)改 static int init_v4l2(struct vdIn *vd)函數

/*

* set format int

*/

前添加如下(xia)代碼

int input = 0;

ret = ioctl(vd->fd, VIDIOC_S_INPUT, &input);

if (ret < 0) {

perror(“Unable to set input”);

goto fatal;

}

/ *

* set framerate

*/

前添加

vd->fmt.type = 0x80;

ret = ioctl(vd->fd, VIDIOC_S_FMT, &vd->fmt);

if (ret < 0) {

perror(“Unable to set format”);

goto fatal;

}

注釋如(ru)下代(dai)碼

/*

* set framerate

*/

struct v4l2_streamparm *setfps;

setfps = (struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm));

 memset(setfps, 0, sizeof(struct v4l2_streamparm));

setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

setfps->parm.capture.timeperframe.numerator = 1;

setfps->parm.capture.timeperframe.denominator = vd->fps;

ret = ioctl(vd->fd, VIDIOC_S_PARM, setfps);

修改

vd->buf.length, PROT_READ, MAP_SHARED, vd->fd,

vd->buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, vd->fd,

修改(gai) int uvcGrab(struct vdIn *vd)函數

修改

ret = ioctl(vd->fd, VODIOC_DQBUF, &vd->buf);

if (ret < 0) {

perror(“Unable to dequeue buffer&rdquo;);

goto err;

}

retry:

ret = ioctl(vd->fd, VODIOC_DQBUF, &vd->buf);

if (ret < 0) {

usleep(10000);

goto retry;

}

修改

memcpy(vd->framebuffer, vd->mem[vd->buf.index], (size_t) vd->bytesused);

memcpy(vd->framebuffer, vd->mem[vd->buf.index], (size_t) vd->framesizeIn);

修(xiu)改 static int video_enable(struct vdIn *vd)函數

vd->isstreaming = 1;

前添加

sleep(1);

c) 編譯 mjpg-streamer

make clean

make

6)錯誤

    &nbsp;  plugins/input_uvc all

       make[1]: Entering directory `/home/swchen/code/tools/mjpeg/mjpg-streamer/plugins/input_uvc'

        arm-linux-gcc -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/swchen/code/tools/libjpeg/jpeg-install/include -o input_uvc.so input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo -ljpeg -L /home/swchen/code/tools/libjpeg/jpeg-install/lib

 /home/swchen/enviroment/4.1.2/bin/../lib/gcc/arm-angstrom-linux-gnueabi/4.1.2/../../../../arm-angstrom-linux-gnueabi/bin/ld: v4l2uvc.lo: Relocations in generic ELF (EM: 3)

 /home/swchen/enviroment/4.1.2/bin/../lib/gcc/arm-angstrom-linux-gnueabi/4.1.2/../../../../arm-angstrom-linux-gnueabi/bin/ld: v4l2uvc.lo: Relocations in generic ELF (EM: 3)

 v4l2uvc.lo: could not read symbols: File in wrong format

 collect2: ld returned 1 exit status

&nbsp;    make[1]: *** [input_uvc.so] Error 1

     make[1]: Leaving directory `/home/swchen/code/tools/mjpeg/mjpg-streamer/plugins/input_uvc'

     make: *** [input_uvc.so] Error 2

說的(de)是錯誤的(de)格式。 但(dan)是自己很確定自己在編(bian)譯libjpeg的(de)使用時交叉編(bian)譯的(de),這么說的(de)話libjpeg就不會有問題的(de)。

是在mjpg-streamer這(zhe)邊出(chu)了問(wen)題,由于問(wen)題一的(de)緣故(gu),自己使用了make 和 make CC=arm-linux-gcc 重(zhong)復(fu)了很多次(ci)。

所以有部分的生成的文(wen)件(jian) 是(shi)x86下(xia)的。 所以才導致了這個(ge)問題。

這個只要清空(kong)一下就好(hao),make clean -w ,再重新編譯(yi),這個問(wen)題跳過了(le)。

上一篇:signal函數

下一篇:qt化步驟

熱點文章(zhang)推薦(jian)
華清(qing)學(xue)員就業(ye)榜單
高薪學員經驗分享(xiang)
熱點新聞(wen)推薦
前臺專線:010-82525158 企業培訓洽談(tan)專線:010-82525379 院(yuan)校合作(zuo)洽(qia)談專(zhuan)線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部