s3c2440 ARM9 移植mjpg-streamer
文章内容:
- mjpg-stream介紹
- 硬體環境
- 移植過程
- Linux3.0核心配置
- libjpeg庫移植
- mjpg-stream移植
- 測試及調試
一、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
三、移植過程
-
Linux3.0核心配置
1、配置核心是核心支援UVC格式的攝像頭 (其實預設支援UVC,它是标準協定),最後一步時根據自己需要進行選擇攝像頭配置。
cd linux-3.0
make menuconfig
2、重新編譯arm闆核心,燒入到開發闆,啟動後将USB攝像頭插進開發闆,序列槽右資訊自動彈出,即識别成功。Device Drivers ---> <*> Multimedia support ---> [*] Video capture adapters ---> [*] V4L USB devices ---> <*> USB Video Class (UVC) [*] UVC input events device support
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
-
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
-
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