自从大学随着兴趣做了几个单片机和arm的小DIY之后就没有接触过c语言了,这两年一直在搞java和c#,现在编c语言的程序还得经常百度各种用法,虽然会用python但是感到对底层api不了解的话难以根治这个帖子中的问题,所以决定写一个c语言的程序研究一下v4l2。
这个程序还会更新,分享出来是因为网上代码虽然很多但是比较杂乱而且没有注释(对大神来说扫一眼就能看明白么??),也没有按照结构分块。希望能帮助到需要帮助的人,顺便希望如果高手们有空的话能给我一些指点。
说说这两天的心得:
因为希望在windows上完成开发和调试,经过各种查找发现Visual Studio+WinGDB还是蛮好用的,这里有关于安装和配置的教程
调试的时候如果想看到printf的数据,可以这样-在菜单栏WinGDB下选择Show process console。
现在遇到的问题:
我用的摄像头是罗技C270,测试V4L2对它只支持MJPEG和YUYV格式。
使用YUYV格式截图,截图格式是*.ppm 写到这里想到是不是MJPEG格式就能截成jpg了呢???
貌似截图成*.ppm需要用fprint写个文件头(是应该这么叫吧)
fprintf(file_fd, "P6\n%d %d\n 255\n",imageWidth, imageHeight);
网上有的例程没有这一句,干脆打不开截图。
现在截图是附件中这种效果,我 觉得 是在读写buffer的时候哪里有问题,但buffer操作算是我比较薄弱的部分
希望能得到指点
不知道程序是这样分成几个文件方便大家参考阅读还是合成一个.c比较好?觉得一个文件好的话回复一下,我合并一下再传一份传上来。
每次编辑帖子都要重新审核,不知道什么级别能直接发出来帖子?????
下面附上一般操作流程① 打开设备文件。 int fd=open(”/dev/video0″,O_RDWR)。 ② 取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。命令VIDIOC_QUERYCAP,结构体struct v4l2_capability。 ③ 设置视频的帧格式,帧的格式个包括宽度和高度等。命令VIDIOC_S_FMT,结构体struct v4l2_format。 ④ 向驱动申请帧缓冲,一般不超过5个。结构体struct v4l2_requestbuffers。 ⑤ 将申请到的帧缓冲映射到用户空间,直接操作采集到的帧。 ⑥ 开始视频的采集。命令VIDIOC_STREAMON。 ⑦ 出队列以取得已采集数据的帧缓冲,取得原始采集数据。命令VIDIOC_DQBUF。 ⑧ 将缓冲重新入队列尾,这样可以循环采集。命令VIDIOC_QBUF。 ⑨ 停止视频的采集,命令VIDIOC_STREAMOFF。 ⑩ 关闭视频设备,close(fd)。
|