最近想做视频监控,手上就一块TINY6410和一个未知什么牌子的摄像头,
现在先做一下H264的视频监控。由于国嵌已经有做过,所以可以借鉴一下。
我直接用的tiny6410开发板带的linux2.6.38内核,不过有人说新版内核的不支持V4L,只支持V4L2。先试试。我用的Fedora12
1. H264视频监控.rar
高级项目试验手册.pdf
2. 找个地方解压h264源码包
[root@localhost h264]# pwd /h264
3.进到.../avc-src-0.14/avc/build/linux
编辑makefile文件,修改CC=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc 按自己的情况改
保存退出,make.
我是一次性通过,显示done之后,
[root@localhost linux]# cd ../bin/ [root@localhost bin]# ls CampFile.264 t264 t264libd.lib [root@localhost bin]# file t264 t264: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses sharedlibs), for GNU/Linux 2.6.27, not stripped
显示,这个t264就是我要的。
4.删除T264.o目标文件
[root@localhost bin]# cd ../obj/ [root@localhost obj]# rm T264.o
5.找到server_arm.c文件
修改server_arm.c文件,把udps_respon里的IP改为自己PC电脑的IP地址。
void udps_respon(int sockfd,int w,int h) { struct sockaddr_in addrsrc; struct sockaddr_in addrdst; int addrlen,n; int32_t iActualLen; int row_stride = w*3*h/2; bzero(&addrdst,sizeof(struct sockaddr_in)); addrdst.sin_family=AF_INET; /*客户端PC机IP地址*/ addrdst.sin_addr.s_addr=inet_addr("192.168.1.111"); addrdst.sin_port=htons(SERVER_PORT); while(1) { /*数据的采集*/ read_video(NULL,w,h); /*对采集到的数据通过H264编码*/ iActualLen = T264_encode(m_t264, cam_data, m_pDst, row_stride); printf("encoded:%d, %d bytes.\n",row_stride,iActualLen); /*frame_num:存放帧号*/ memcpy(m_pPoolData,&m_t264->frame_num,1); /*m_pDst解码后的数据*/ memcpy(m_pPoolData+1, m_pDst, iActualLen); iActualLen++; /*使用UDP协议发送编码后的数据到客服端*/ sendto(sockfd,m_pPoolData,iActualLen,0,(struct sockaddr*)&addrdst,sizeof(struct sockaddr_in)); } }
make.之后生成server_arm。通过NFS启动根文件系统的话,直接在虚拟机里复制到根文件系统里。启动开发板,插上摄像头,显示
[root@Lc-system /]# usb 1-1.3: new full speed USB device using s3c2410-ohci and address 3 usb 1-1.3: New USB device found, idVendor=0ac8, idProduct=3330 usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 1-1.3: Product: Sirius USB2.0 Camera usb 1-1.3: Manufacturer: Vimicro Corp. uvcvideo: Found UVC 1.00 device Sirius USB2.0 Camera (0ac8:3330) input: Sirius USB2.0 Camera as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.3/1-1 .3:1.0/input/input1
执行./server_arm 出错
[root@Lc-system /]# ./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
了解可能是内核版本问题,还有摄像头问题。待解决
如果遇到跟我一样问题的朋友,不妨看一下我的(3)http://blog.csdn.net/lin772662623/article/details/7786042