天天看點

s3c2440 ARM9 移植mjpg-streamer

s3c2440 ARM9 移植mjpg-streamer

文章内容:

  1. mjpg-stream介紹
  2. 硬體環境
  3. 移植過程
    1. Linux3.0核心配置
    2. libjpeg庫移植
    3. mjpg-stream移植
  4. 測試及調試

一、mjpg-stream介紹

  MJPEG 全名為 “Motion Joint Photographic Experts Group”,是一種視訊編碼格式,

  Motion JPEG技術常用與閉合電路的電視錄影機的模拟視訊信号“翻譯”成視訊流,并存儲在硬碟上。典型的應用如數字視訊記錄器等。

  mjpg‐streamer是一個開源軟體,用于從webcam攝像頭采集圖像,把它們以流的形式通過基于ip的網絡傳輸到浏覽器如Firefox,Cambozola,VLC播放器,Windows的移動裝置或者其他擁有浏覽器的移動裝置.mjpg-streamer 可以通過檔案或者是HTTP方式通路linux UVC相容攝像頭。

二、硬體環境

主機環境:ubuntu14.04

目标機:FL2440開發闆

主機工具鍊:gcc-4.6

交叉工具鍊:/opt/xtools/arm920t/bin/arm-linux-gcc

三、移植過程

  1. Linux3.0核心配置

    1、配置核心是核心支援UVC格式的攝像頭 (其實預設支援UVC,它是标準協定),最後一步時根據自己需要進行選擇攝像頭配置。

    cd linux-3.0
    make menuconfig
    Device Drivers  --->
    
           <*> Multimedia support  --->
    
                     [*]   Video capture adapters  --->
    
                            [*]   V4L USB devices  ---> 
                                     <*>   USB Video Class (UVC)
    
                                      [*]     UVC input events device support
               
    2、重新編譯arm闆核心,燒入到開發闆,啟動後将USB攝像頭插進開發闆,序列槽右資訊自動彈出,即識别成功。
    make -j2
    ~ >: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci
    uvcvideo: Found UVC 1.00 device USB 2.0 PC Cam (090c:71b3)
    input: USB 2.0 PC Cam as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.1/1-1.1:1.0/input/input0
               
  2. jpeg庫移植

    mjpg-stream的移植需要jpeg的庫,是以我們先移植jpeg的庫 ,即需要libjpeg.

    (1)jpeg源碼包下載下傳

    http://www.ijg.org/files/jpegsrc.v8b.tar.gz
    (2)解壓源碼包
    tar xvf jpegsrc.v8b.tar.gz
    (3)配置源碼、編譯并安裝

    cd jpeg-8b

    ./configure --prefix=/usr/local/src/out_jpeg -host=arm-linux

    ./configure CC=/opt/xtools/arm920t/bin/arm-linux-gcc --prefix=/usr/local/src/out_jpeg -host=arm-linux

    make && make install

    (4)安裝完成後,上面配置的/usr/local/src/out_jpeg 檔案夾中便出現了bin、include、lib、share。其中include、lib便是mjpg-stream需要的。

    (5)拷貝上述檔案夾lib,即jpeg庫到根檔案系統中。

    cp -ri /usr/local/src/out_jpeg/lib/* …/rootfs/lib
  3. mjpg-stream移植

    (1)下載下傳最新闆mjpg-streamer源碼至/usr/local/src/。

    cd /usr/local/src/

    svn checkout https://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code

    檔案夾包含

    doc

    mjpg-streamer —>提供執行程式和哥哥輸入輸出裝置元件

    udp_client

    mjpeg-client —>分别有 linux和windows 的用戶端

    mjpg-streamer-experimental

    uvc-streamer —>提供了 uvc-streamer的可執行目錄

    (2)進入目錄mjpg-streamer并修改源碼

    1、修改源碼 頂層的Makefile及plugins檔案夾裡面所有子層的Makefile中的CC參數為arm-linux-gcc,即将所有“CC = gcc”改為“CC = /opt/xtools/arm920t/bin/arm-linux-gcc”

    2、進入/plugins/input_uvc/Makfile

    修改

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

    CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /usr/local/src/out _jpeg/include

    修改

    (CC)(CFLAGS) -o @inputuvc.c v4l2uvc.lo jpegutils.lo dynctrl.lo ($LFLAGS)

    (CC)(CFLAGS) -L /usr/local/src/out_jpeg/lib -o @inputuvc.c v4l2uvc.lo jpegutils.lo dynctrl.lo ($LFLAGS)

    (注:/usr/local/src/out_jpeg/lib 就是上面移植jpeg庫後安裝的目錄,根據自己設定的目錄來修改)

    3、編譯make,在mjpg-stream目錄下生成了 input*.so、 output*.so 和 mjpg_streamer 可執行檔案

    4、在開發闆挂載的ubuntu檔案系統目錄中(本人為…/rootfs)建立mjpg-streamer安裝目錄,再将源碼目錄mjpg-stream整個拷貝到/root/rootfs/rootfs/mjpg-streamer目錄下,然後就可以測試啦

    mkdir /…/rootfs/mjpg-streamer

    cp -ri mjpg-stream/* /root/rootfs/rootfs/mjpg-streamer

四、測試及調試

啟動arm闆,闆子應設定好環境變量,讓arm闆通過tftp下載下傳核心和挂載好ubuntu中的自制作檔案系統。

啟動後,插進USB攝像頭,進入闆子的mjpg-streamer 目錄,

執行 ./start.sh;

若沒有出現錯誤,則在PC機打開一個網頁,輸入http://(ip):8080/?action=stream就可以看到圖像。 (ip為arm闆的ip)

若出現下面錯誤:

Unable to set format: Invalid argument

Init v4L2 failed !! exit fatal

i: init_VideoIn failed

錯誤原因:

市面上大部分攝像頭都是支援YUV的,而不是JPEG的。mjpg-stream支援JPEG和YUV兩種格式。

int input_init(input_parameter *param, int id)
{
    char *dev = "/dev/video0", *s;
    int width = 640, height = 480, fps = -1, format = **V4L2_PIX_FMT_MJPEG**, i;

    
    if(pthread_mutex_init(&cams[id].controls_mutex, NULL) != 0) {
        IPRINT("could not initialize mutex variable\n");
        exit(EXIT_FAILURE);
    }
    ...........
}
           

将上面第4行中

format = V4L2_PIX_FMT_MJPEG

改為:

format = V4L2_PIX_FMT_YUYV

繼續閱讀