6410采集摄像头数据本地LCD回显图片

来源:互联网 发布:搭建个人云计算平台 编辑:程序博客网 时间:2024/05/22 05:12
菜鸟来写写人生的第一篇博文,以后自己回看可以复习复习,刚接触ARM半年,纯属分享经验,不喜来
喷,以前都是伸手党,现在自己来分享一下感觉还是挺良好的。


主要想做的一个小实验室采集摄像头视频流通过6410的MFC硬件编码,转为H264,通过wifi模块传输。




(1)先做第一步采集视频流


1,友善的tiny6410 + v4l +无名摄像头;(无法正常传指令给与摄像头)



  两个月前先看了2010年国嵌版教程的一个项目《H.264远程视频监控》有视频有源码。虽然有点久远

了哈,想看的我也贴上地址。http://pan.baidu.com/s/1jGiT9v4   密码:mrfa

  好,继续。既然刚接触视频驱动这块,自己肯定也是百度了一堆的资料,发现有点奇怪,国嵌的代码
和网上的许多代码都有点不一样,例如:
国嵌的ioct(cam_fd,VIDIOCGCAP,&cam_cap );和网上
ioctl( dev_id,VIDIOC_QUERYCAP,cam_cap ); 
这个函数都是为了获得摄像头的基本信息,为什么一个的宏用了VIDIOCGCAP而一个用
VIDIOC_QUERYCAP。我也不管他三七二十一了,先照着国嵌的来就是了。然后基本的代码,就是打
开设备,获取摄像头基本信息等简单函数都写好之后就开始放板上跑了。试了一天,左改右改的,还是
获取不了摄像头的信息。后来淡定地从头看一遍,发现国嵌代码用的头文件有一个是#include 
<linux/videodev.h>,然后网上用的是#include <linux/videodev2.h>。这下才知道国嵌用的是v4l,现在

已经有v4l2了。然后就改代码,都改成v4l2版的,顺利地就获取的摄像头的信息了。

(这一步当时没有截图下来,现在代码也改了那么多,现在没得配图说明,只能文字描述描述了)




2.友善的tiny6410 + v4l2 +无名摄像头;(能获得设备名,但不能设置摄像头参数)


根据步骤接下来就是设置摄像头了。直接就copy百度上的代码了,然后一直就是在这个地方出错:
/*
if (-1 == ioctl(fd, VIDIOC_STREAMON, &type)) //开始捕捉图像数据
printf("VIDIOC_STREAMON failed\n");

耗了两天的时间,一直都在改代码,不断百度,找了很多代码。但其实找来找去就是那一两篇在到处流

传而已。改到最后实在是能改的地方都改了,没办法了,就开始怀疑硬件和它的摄像头的底层驱动了,

因为摄像头插进板的时候板能识别出来而且能生成设备文件/dev/video2,就先不怀疑它了(其实应该

底层驱动也有点问题,没细究)就先从摄像头入手检测了。果然,在PC上都不能正常工作,买了个表~

它坏了~!


参考博文,博主牛叉写得很好,连写了一个系类呢,哈哈。
http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html


最经典的还是linuxTV官网推出的capture.c,地址


http://linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/v4l2spec/capture.c





3.友善的tiny6410 + v4l2 +zc301 (新买的zc301只有JPEG格式输出流)

第二天就到某宝进购了个zc301,真TM快,傍晚买隔天早上就到了。


上图是zc301插入板后识别的信息,而下面一张是之前那个摄像头的信息,对比略有不同。



兴匆匆地拆开趁热来一发,哈哈,果然松松地就设置上了。但这时候注意到一点,测试信息打印出来只支持JEPG。

/*
额~~~心想算了,不要在意这些细节了。接着就是拍个靓照保存到本地先。嗯,OK,这一步还算顺利,
没多久就搞定了,而且采集的图片直接是JPEG格式了,随便看图软件打开看。哈哈,接着就是编码压
缩了。一看资料,买了个表。硬编转成H264格式的源要是YUYV之类(不记得了,懒得查)的格式,那我还得再将
JPEG转一次了。又百度了一下怎么转,心也是碎了,转得麻烦也是算了,而且这方面的资料也是少~伸
手党表示心慌慌。百度了一两天,也没找到什么好的解决方案,算了,之后再说吧,就算是转了过去,
然后再次编码成H264,这中间的时间要多少,这一秒能有个多少帧出来而。于是果断先搁置着,或
者以后能借个YUYV的摄像头呢。(后来在友善论坛看,好像JPEG也可以直接硬编了)


4.tiny6410 + v4l2 +zc301  + LCD
虽然采集的数据不能压缩在网络传输,但在本地里还是松松的了,就想着在LCD里回显先了(其实我也
不知道应该怎么回显),那就应该想办法将采集的每一帧做成某个视频格式了。
网上看到说,YUYV格式的视频流将每一帧不断地保存起来,就是对应的连贯视频了。呵呵,天真的我
就想着JPEG一帧帧保存起来说不定也行叻,然后,然后就不提了,我就又SB一回了。接着又是百度了
大半天的将一帧帧的JPEG保存为视频,又是无果。


OK,anyway,保存成视频不行,也不知道主流的回显示怎么做的,不过一个月前学了点QT,那我就采
一帧直接用调用QT显示出来,不断地采->显,这样看起来有视频的效果,虽然我知道这样的流畅度肯
定弱到爆,但是弄着玩嘛,菜鸟就是这么任性。直接把之前的C代码放进QT的代码里,这样混编居然松
松就编译过了,然后执行的时候出现了内核错误,原因似乎是在于友善配的这个内核有问题,很多网友
都是相同的问题,但都没解决。
------------[ cut here ]------------
WARNING: at kernel/mutex.c:205 __mutex_lock_slowpath+0xc4/0x2ac()
Modules linked in:
[<c0177c44>] (unwind_backtrace+0x0/0xe4) from [<c0187078>] (warn_slowpath_common


+0x4c/0x64)
[<c0187078>] (warn_slowpath_common+0x4c/0x64) from [<c01870a8>] (warn_slowpath_null


+0x18/0x1c)
[<c01870a8>] (warn_slowpath_null+0x18/0x1c) from [<c051619c>] (__mutex_lock_slowpath


+0xc4/0x2ac)
[<c051619c>] (__mutex_lock_slowpath+0xc4/0x2ac) from [<c05163a4>] (mutex_lock


+0x20/0x38)
[<c05163a4>] (mutex_lock+0x20/0x38) from [<c0441614>] (s3c_fimc_open+0x38/0xa8)
[<c0441614>] (s3c_fimc_open+0x38/0xa8) from [<c03c450c>] (v4l2_open+0x9c/0xd0)
[<c03c450c>] (v4l2_open+0x9c/0xd0) from [<c01e4f10>] (chrdev_open+0x168/0x190)
[<c01e4f10>] (chrdev_open+0x168/0x190) from [<c01e031c>] 


(__dentry_open.clone.12+0x164/0x26c)
[<c01e031c>] (__dentry_open.clone.12+0x164/0x26c) from [<c01ed194>] (finish_open


+0x80/0x158)
[<c01ed194>] (finish_open+0x80/0x158) from [<c01ed610>] (do_filp_open+0x11c/0x520)
[<c01ed610>] (do_filp_open+0x11c/0x520) from [<c01e1144>] (do_sys_open+0x58/0xe4)
[<c01e1144>] (do_sys_open+0x58/0xe4) from [<c01725e0>] (ret_fast_syscall+0x0/0x30)
---[ end trace dbc45def69de5948 ]---
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = cc458000
[00000000] *pgd=5c436831, *pte=00000000, *ppte=00000000
Internal error: Oops: 817 [#1] PREEMPT
last sysfs file: /sys/devices/virtual/vc/vcsa2/dev
Modules linked in:
CPU: 0    Tainted: G        W    (2.6.38-FriendlyARM #13)
PC is at __mutex_lock_slowpath+0xf8/0x2ac
LR is at __mutex_lock_slowpath+0xe0/0x2ac
pc : [<c05161d0>]    lr : [<c05161b8>]    psr: 40000093
sp : cd4ebde8  ip : 11111111  fp : ccfef000
r10: cd1568c0  r9 : c01e4da8  r8 : cd4ebde8
r7 : c0793ee0  r6 : cd4c32c0  r5 : 60000013  r4 : c0793ecc
r3 : 00000000  r2 : cd4ea000  r1 : cd4ebde8  r0 : c0793ecc
Flags: nZcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
。。。。。。
随便搜一下上面的代码就可以找到友善论坛上很多人已经提过这个问题了,但都没有解决方案。


哎,算了,那就将采集和显示分成两个进程执行了,先执行视频初始化进程,之后在用exec族开启QT
显示进程。好了,现在是两个进程,那图片的缓存应该用什么通讯方式来传递呢。小菜鸟大脑燃烧了一
下,觉得fifo好像是叼叼的样子,因为它读写不能同时,还有阻塞,似乎能起传输同步的样子,就试着
先用它了。


好了,写完上电,奔跑吧。泥马,丢帧丢地厉害,一开始以为是时间太快了,然后调试4秒一帧还是丢
。后来看了一下fifo的具体资料才知道,写入的最大值PIPE_BUF只有4KB,一帧JPEG要118K,然后根
据fifo的原子性...这个就不说了,传肯定是会传的,但是原本一帧帧都乱套了。

~这两天白天都去参加了某个培训集团的免费网络培训(一半时间都被用来宣传了),晚上回来弄这个
6410两眼都有点放空了,一切从简了,我就直接将采集的数据写到文件里,然后在让QT直接读取文件
了。结果挺OK,帧率不敢设快,0.4s采一帧就好了,虽然画面卡得想砸它,能显示就不错了。
/*

程序里没有严格地读写同步,丢帧是肯定的,加上信号量同步应该就Ok了。程序bug也是挺多的,现在
没精力改,之后再改吧。这里先贴上两个简陋的程序代码。
编译采集程序命令直接用:arm-linux-gcc video_t.c -static -o voidet -lpthread

编译QT程序:库是QTEmbedded4.7.0 开发工具用QT Creator 怎么编译就参考 ->友善提供的 QT4和
Qtopia编程开发指南->地址:http://pan.baidu.com/s/1i3gTFSh 密码:inex


两个程序代码:http://pan.baidu.com/s/1i3H11Ql 密码:t6vi



最后再说明一下,友善s5pv210的板似乎没有带摄像头驱动,所以用210的朋友还要先自己移植摄像头

驱动。


待续。。

0 0
原创粉丝点击