在raspberry上使用USB攝像頭做視頻採集

以前看過國嵌的H.264視頻採集程序,想在樹莓派上試一試,現在記錄一下自己嘗試的過程。

檢查是否支持USB攝像頭

插入USB攝像頭前

pi@raspberrypi:~$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 

插入USB攝像頭後

pi@raspberrypi:~$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 1e4e:0109 

可以看到raspberry已經識別了USB攝像頭。

要想拍攝照片,你要先安裝fswebcam,這是一款小型攝像頭程序。可以直接通過Raspbian的倉庫來安裝fswebcam。
$ sudo apt-get install fswebcam
fswebcam安裝完成後,在終端中運行下面的命令來抓一張來自攝像頭的照片:

$ fswebcam --no-banner -r 640x480 image.jpg
pi@raspberrypi:~$ fswebcam --no-banner -r 640x480 image.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to 'image.jpg'.

V4L(Video for Linux 標準,按照統一的公共接口去使用不同種類的USB攝像頭)
驅動程序與應用程序之間的統一接口,雙方都必須遵守該接口的定義。

在宿主機上進行編譯,然後將可執行文件放到樹莓派上,執行server_arm程序後報錯:

pi@raspberrypi:~/H264$ ./server_arm 
start 2.0...
Can't get device information: VIDIOCGCAP
Device name:
Width:0 ~ 0
Height:0 ~ 0
ERROR:VIDIOCGWIN
ERROR:VIDIOCSWIN
ERROR:VIDIOCGPICT
ERROR: VIDIOCSPICT,Can't set video_picture format
ERROR:VIDIOCGMBUF,Can't get video_mbuf
Frames:0
ERROR:mmap
Buffer size:0
Offset:0
ERROR: VIDIOCMCAPTURE
ERROR: VIDIOCSYNC
Segmentation fault

發現是由於獲取攝像頭基本信息失敗造成的,如下所示:

ret = ioctl( cam_fd,VIDIOCGCAP,&cam_cap );  /* 獲取攝像頭的基本信息 */
if( ret<0 ) {
    printf("Can't get device information: VIDIOCGCAP\n");
}

查證後,發現在V4L2中,規定必須實現 VIDIOC_QUERYCAP命令,而V4L則規定必須實現VIDIOCGCAP,決定嘗試改爲V4L2的命令,重新編譯、運行,有人遇到過該問題v4l(video for Linux)使用攝像頭實驗的一點小感慨。關於V4L2與V4L的關係可以參考V4L簡介及其與V4L2區別

可以看出raspberry已經安裝了V4L2的內核模塊,如下:

pi@raspberrypi:~/H264$ lsmod | grep v4l
v4l2_common 3777  1 videobuf2_core
videodev  121307  3 uvcvideo,v4l2_common,videobuf2_core

在宿主機上安裝V4L的庫

zfchen@zfchen-E440:/$ sudo apt-get install libv4l-dev

查看庫文件的安裝路徑

zfchen@zfchen-E440:/usr/lib$ dpkg -L libv4l-dev
/.
/usr
/usr/include
/usr/include/libv4l1-videodev.h
/usr/include/libv4l1.h
/usr/include/libv4l2.h
/usr/include/libv4lconvert.h
/usr/lib
/usr/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu/pkgconfig
/usr/lib/i386-linux-gnu/pkgconfig/libv4l1.pc
/usr/lib/i386-linux-gnu/pkgconfig/libv4l2.pc
/usr/lib/i386-linux-gnu/pkgconfig/libv4lconvert.pc
/usr/share
/usr/share/doc
/usr/lib/i386-linux-gnu/libv4l1.so
/usr/lib/i386-linux-gnu/libv4l2.so
/usr/lib/i386-linux-gnu/libv4lconvert.so
/usr/share/doc/libv4l-dev

從Linux內核中找到了V4L2的頭文件,添加到H264/app/目錄下。 頭文件路徑爲:include/linux/videodev2.h頭文件,實際上指向/include/uapi/linux/videodev2.h頭文件(該路徑下面還有v4l2-common.hv4l2-common.h文件)。
編譯,make 輸出信息如下,包含一些警告信息:

zfchen@zfchen-E440:~/my_repository/H264/app$ make
arm-bcm2708hardfp-linux-gnueabi-cc-c -o server_arm.o server_arm.c
server_arm.c: In function 'init_encoder':
server_arm.c:265:14: warning: assignment makes pointer from integer without a cast [enabled by default]
server_arm.c: In function 'main':
server_arm.c:337:3: warning: passing argument 1 of 'printf' from incompatible pointer type [enabled by default]
In file included from server_arm.c:7:0:
/home/zfchen/my_repository/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/../arm-bcm2708hardfp-linux-gnueabi/sysroot/usr/include/stdio.h:359:12: note: expected 'const char * __restrict__' but argument is of type 'struct _IO_FILE *'

編譯通過後,發現執行還是有錯,錯誤信息如下:

pi@raspberrypi:~$ ./server_arm fastspeed.txt 
start 2.0...
Device name:uvcvideo
Width:0 ~ 943285811
Height:761426805 ~ 808464432
ERROR:VIDIOCGWIN
ERROR:VIDIOCSWIN
ERROR:VIDIOCGPICT
ERROR: VIDIOCSPICT,Can't set video_picture format
ERROR:VIDIOCGMBUF,Can't get video_mbuf
Frames:0
ERROR:mmap
Buffer size:0
Offset:0
ERROR: VIDIOCMCAPTURE
ERROR: VIDIOCSYNC
Segmentation fault

修改 VIDIOCGWIN 指令之後仍然報錯,沒弄明白。
然後找到一篇根據國嵌的程序改的v4l2程序 ,使用這個代碼後發現,服務器端可以執行,但是客戶端(PC)的上位機顯示爲花屏。

發佈了37 篇原創文章 · 獲贊 22 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章