《嵌入式相关资料》《基于嵌入式的家庭远程监控系统》项目总结使用v4l2视频数据采集一、打开设备文件,和普通文件那样打开即可二、捕捉视频的前期准备1、获取参数和设置要求v4l2_capability结构体通过VIDIO_QUERYCAP操作命令获取设备驱动的参数,保存于v4l2_capability结构体中,包括driver(驱动名),card(设备名),bus_info(总线信息)等v4l2_cropcap结构体先设置v4l2_cropcap的type域,再通过VIDIO_CROPCAP操作命令获取设备捕捉能力的参数,保存于v4l2_cropcap结构体中,包括bounds(最大捕捉方框的左上角坐标和宽高),defrect(默认捕捉方框的左上角坐标和宽高)等v4l2_format结构体先填好v4l2_format的各个域,如type(传输流类型),fmt.pix.width(宽),fmt.pix.heigth(高),fmt.pix.field(采样区域,如隔行采样),fmt.pix.pixelformat(采样类型,如YUV4:2:2),然后通过VIDIO_S_FMT操作命令设置视频捕捉格式《嵌入式相关资料》2、初始化内存映射v4l2_requestbuffers结构体先填好v4l2_requestbuffers的一些域,如count(帧缓冲个数)等,通过操作命令VIDIO_REQBUFS根据v4l2_requestbuffers的要求向内核申请帧缓冲向内存申请相对应的映射空间,然后再使用mmap()系统调用实现内核中的帧缓冲和内存中映射空间相互映射v4l2_buffer结构体由于在内核中申请帧缓存和在内存中申请映射空间不同,后者申请后返回首地址,以后可以通过该首地址向映射空间操作,而前者没有,所以得要v4l2_buffer结构体做中介。先填好v4l2_buffer结构体的一些域,如index(帧号),type(传输流类型),然后通过操作命令VIDIO_QUERYBUF获取相对应于帧号的缓冲帧的信息,并保存于v4l2_buffer结构体中《嵌入式相关资料》三、捕捉视频1、启动摄像头捕捉视频v4l2_buf_type枚举类型将其设置为V4L2_BUF_TYPE_VIDIO_CAPTURE类型,然后使用VIDIOC_STREAMON操作命令根据v4l2_buf_type的值开始捕捉视频2、不断的读取数据用select()系统调用轮询文件描述符集合中的设备是否准备好,如果准备好,即只要从映射空间中读取数据即可注意:在这两个过程中,需要不断地将已经读取完数据的缓冲帧出队列,并插进到队列尾,以存储摄像头捕捉到的新数据3、停止摄像头捕捉视频和启动摄像头捕捉视频类似,只是改用VIDIO_STREAMOFF操作命令罢了四、关闭设备文件,和普通文件那样关闭即可背景:阅读新闻《基于嵌入式的家庭远程监控系统》项目总结SDL学习入门[日期:2012-07-14]来源:Linux社区作者:xuyuanfan77[字体:大中小]1、搭建开发平台(1)sudoapt-getinstalllibsdl1.2-dev《嵌入式相关资料》最基本的开发包(2)sudoapt-getinstalllibsdl-image1.2-dev关于图像的开发包(3)sudoapt-getinstalllibsdl-mixer1.2-dev关于音频的开发包(4)sudoapt-getinstalllibsdl-ttf2.0-dev关于文字的开发包安装好以上四个开发包,开发平台算是搭建好了2、最有代表性的简单程序,包括图像,文字,音乐,注释如下:1.#includestdio.h2.#includestdlib.h3.#includeSDL/SDL.h4.#includeSDL/SDL_image.h5.#includeSDL/SDL_mixer.h6.#includeSDL/SDL_ttf.h7.8.staticSDL_Surface*screen;//SDL窗口9.10.intmain(intargc,char*argv[])11.{12.13.intquit=0;14.SDL_Surface*text_sur;//文字容器15.SDL_Surface*background;//图像容器16.SDL_Eventevent;17.SDL_Colorcolor;18.SDL_Rectsrect,drect;19.Mix_Music*bgsound;20.TTF_Font*font;21.22.//初始化SDL23.if(SDL_Init(SDL_INIT_VIDEO||SDL_INIT_AUDIO)0)24.{25.fprintf(stderr,SDLiniterror:%s\n,SDL_GetError());26.exit(0);27.}28.atexit(SDL_Quit);//注册退出时调用的操作29.30.31.//设置SDL屏幕大小《嵌入式相关资料》32.screen=SDL_SetVideoMode(600,400,24,SDL_HWSURFACE);33.if(screen==NULL)34.{35.fprintf(stderr,Setvideomodefailure:%s\n,SDL_GetError());36.exit(0);37.}38.39.//设置SDL窗口标题40.SDL_WM_SetCaption(test,NULL);41.42./*显示图像*/43.background=IMG_Load(background.jpg);//导入图像文件,并将图像放入文字容器44.srect.x=0;45.srect.y=0;46.srect.w=background-w;47.srect.h=background-h;48.drect=srect;//设置截取范围49.SDL_BlitSurface(background,&srect,screen,&drect);//将图像容器放入SDL窗口50.51./*显示文字*/52.//初始化TTF53.if(TTF_Init()0)54.{55.fprintf(stderr,TTFiniterror:%s\n,SDL_GetError());56.return;57.}58.59.font=TTF_OpenFont(test.ttf,40);//导入字体文件60.color.r=255;61.color.g=0;62.color.b=0;//设置文字颜色63.text_sur=TTF_RenderText_Solid(font,Hello,WelcometoGAME!!,color);//将文字放入文字容器64.65.srect.x=0;66.srect.y=0;67.srect.w=text_sur-w;68.srect.h=text_sur-h;69.70.drect.x=(600-text_sur-w)/2;71.drect.y=(400-text_sur-h)/2;72.drect.w=text_sur-w;73.drect.h=text_sur-h;//设置截取范围74.SDL_BlitSurface(text_sur,&srect,screen,&drect);//将文字容器放入SDL窗口《嵌入式相关资料》75.76.SDL_UpdateRect(screen,0,0,600,400);//更新SDL窗口,让新添加的容器显示77.78./*播放声音*/79.Mix_OpenAudio(44100,AUDIO_S16,2,4096);//打开音频80.bgsound=Mix_LoadMUS(bgsound.mp3);//导入声音文件81.Mix_PlayMusic(bgsound,-1);//播放音频82.while(quit==0)83.{84.while(SDL_PollEvent(&event))85.{86.switch(event.type)87.{88.caseSDL_QUIT:89.Mix_CloseAudio();//关闭音频90.quit=1;91.break;92.default:93.break;94.}95.}96.SDL_Delay(100);97.}98.99.return0;100.}问题:gccmain.c-omain编译时可能会出现如下错误:1.main.c:(.text+0x19):undefinedreferenceto`SDL_Init'2.main.c:(.text+0x22):undefinedreferenceto`SDL_GetError'3.main.c:(.text+0x50):undefinedreferenceto`SDL_Quit'4.main.c:(.text+0x79):undefinedreferenceto`SDL_SetVideoMode'5.main.c:(.text+0x8c):undefinedreferenceto`SDL_GetError'6.main.c:(.text+0xc7):undefinedreferenceto`SDL_WM_SetCaption'7.main.c:(.text+0xd3):undefinedreferenceto`IMG_Load'8.main.c:(.text+0x132):undefinedreferenceto`SDL_UpperBlit'9.main.c:(.text+0x137):undefinedreferenceto`TTF_Init'10.main.c:(.text+0x140):undefinedreferenceto`SDL_GetError'11.main.c:(.text+0x174):undefinedreferenceto`TTF_OpenFont'12.main.c:(.text+0x1a3):undefinedreferenceto`TTF_RenderText_Solid'13.main.c:(.text+0x24c):undefinedreferenceto`SDL_UpperBlit'14.main.c:(.text+0x279):undefinedreferenceto`SDL_UpdateRect'15.main.c:(.text+0x29d):undefinedreferenceto`Mix_OpenAudio'《嵌入式相关资料》16.main.c:(.text+0x2a9):undefinedreferenceto`Mix_LoadMUS'17.main.c:(.text+0x2c1):undefinedreferenceto`Mix_PlayMusic'18.main.c:(.text+0x2d5):undefinedreferenceto`Mix_CloseAudio'19.main.c:(.text+0x2ec):undefinedreferenceto`SDL_PollEvent'20.main.c:(.text+0x2fc):undefinedreferenceto`SDL_Delay'21.collect2:ldreturned1exitstatus原因:那是因为该程序用到四个静态库,分别为:(1)SDL(2)SDL_image(3)SDL_ttf(4)SDL_mixer需用-l参数连起来才能编译得过,如:gccmain.c-lSDL-lSDL_image-lSDL_ttf-lSDL_mixer-omain