马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1. 启动和制止数据流
利用下令 VIDIOC_STREAMON 启动摄像头数据流,利用下令 VIDIOC_STREAMOFF 制止摄像头数据流。
这两条下令的定义是:
- #define VIDIOC_STREAMON _IOW('V', 18, int)
- #define VIDIOC_STREAMOFF _IOW('V', 19, int)
复制代码 这两条下令都必要一个 enum v4l2_buf_type 范例的参数作为入参数。参数内容固定填写 V4L2_BUF_TYPE_VIDEO_CAPTURE 。
代码如下:
- /*******************************************************************************
- - Function : __StartStream
- - Description : 本函数启动数据接收。
- - Input : VOID
- - Output : NULL
- - Return : VOID
- - Others :
- *******************************************************************************/
- void __StartStream(void)
- {
- enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- if(-1 == ioctl(g_iFDVideo, VIDIOC_STREAMON, &type))
- {
- printf("Start stream failed.\n") ;
- exit(-1) ;
- }
- return ;
- }
- /*******************************************************************************
- - Function : __StopStream
- - Description : 本函数停止数据接收。
- - Input : VOID
- - Output : NULL
- - Return : VOID
- - Others :
- *******************************************************************************/
- void __StopStream(void)
- {
- enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- if(-1 == ioctl(g_iFDVideo, VIDIOC_STREAMOFF, &type))
- {
- printf("Stop stream failed.\n") ;
- exit(-1) ;
- }
- return ;
- }
复制代码 2. 捕捉数据
代码如下:
- /*******************************************************************************
- - Function : __ReadFrame
- - Description : 本函数读取摄像头数据并写入到文件。
- - Input : VOID
- - Output : NULL
- - Return : VOID
- - Others :
- *******************************************************************************/
- void __ReadFrame(void)
- {
- struct v4l2_buffer stBuf;
- memset(&stBuf, 0, sizeof(stBuf)) ;
- stBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- stBuf.memory = V4L2_MEMORY_MMAP;
-
- if(-1 == ioctl(g_iFDVideo, VIDIOC_DQBUF, &stBuf))
- {
- printf("De-queue buffer failed.\n") ;
- exit(-1) ;
- }
- #if 1 == WRITE_TO_FILE
- if(-1 == write(g_iFDStore, g_pstBufDesc[stBuf.index].pvBufPtr, stBuf.bytesused))
- {
- printf("Write camera data failed.\n") ;
- exit(-1) ;
- }
- #endif
-
- if(-1 == ioctl(g_iFDVideo, VIDIOC_QBUF, &stBuf))
- {
- printf("Re-Queue buffer failed.\n") ;
- exit(-1) ;
- }
-
- return ;
- }
- /*******************************************************************************
- - Function : __CaptureFrame
- - Description : 本函数捕获帧数据。
- - Input : VOID
- - Output : NULL
- - Return : VOID
- - Others :
- *******************************************************************************/
- void __CaptureFrame(void)
- {
- struct timeval stTimeVal ;
- fd_set stFDRead ;
- int iRetVal ;
-
- stTimeVal.tv_usec = 0 ;
- stTimeVal.tv_sec = 2 ;
-
- FD_ZERO(&stFDRead) ;
- FD_SET(g_iFDVideo, &stFDRead) ;
- iRetVal = select(g_iFDVideo + 1, &stFDRead, NULL, NULL, &stTimeVal) ;
-
- if(-1 == iRetVal)
- {
- perror("select") ;
- exit(-1) ;
- }
- else if(0 == iRetVal)
- {
- printf("timeout.\n") ;
- exit(-1) ;
- }
-
- __ReadFrame() ;
- return ;
- }
复制代码 主函数中,首先调用函数 __StartStream 来启动摄像头输出数据的接收。而后调用函数 __CaptureFrame 来捕捉一帧数据。利用 select函数监视摄像头文件形貌符的读操作。一旦监视到,则调用 __ReadFrame 函数来获取数据。
对于V4L2驱动,利用 VIDIOC_DQBUF下令来从缓存队列中取出一块就绪的缓存。该下令的定义如下:
- #define VIDIOC_DQBUF _IOWR('V', 17, struct v4l2_buffer)
复制代码 下令必要一个struct v4l2_buffer范例的参数。
结构体中,index 字段指示了当前是那一块缓冲。bytesused 字段指示了缓冲中有多少有效数据量。对于非编码格式,如YUV或RGB系列格式,应该是整个缓冲都用了。利用index字段可以索引到对应缓存块在用户空间中的地址,从而获取数据。
从队列中取出缓存块后,可对缓存块中数据举行处理,例如写入文件,大概编码等。操作完毕后,还必要将缓存块重新放入到队列中。该操作利用 VIDIOC_QBUF 下令执行。
- #define VIDIOC_QBUF _IOWR('V', 15, struct v4l2_buffer)
复制代码 3. 开释缓存
在利用 VIDIOC_STREAMOFF 下令制止摄像头数据流后,退出程序之前,还必要开释缓存。
- /*******************************************************************************
- - Function : __UnmapBuffer
- - Description : 本函数撤除缓冲区映射。
- - Input : VOID
- - Output : NULL
- - Return : VOID
- - Others :
- *******************************************************************************/
- void __UnmapBuffer(void)
- {
- int iLoop ;
-
- for(iLoop = 0 ; iLoop < 4 ; iLoop++)
- {
- munmap(g_pstBufDesc[iLoop].pvBufPtr, g_pstBufDesc[iLoop].szBufSize) ;
- }
-
- free(g_pstBufDesc) ;
- return ;
- }
复制代码 这里包罗排除 mmap 映射关系,以及开释形貌符。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|