大家好,学习嵌入式linux已经两年了,终于可以自己做点东西了·····前些日子做了个wifi小车,从电路到程序都是自己一点一点弄出来的,心里还是有点小小的成就感的。 其实wifi小车最难弄的我感觉就是视频传输这块,如果这块做成了我感觉也就没有太难的部分了,说下我视频采集这块的思路吧,首先用linux提供的v4l2接口可以采集出视频数据,这部分如果自己不想写的话可以看友善提供的那个mini2440-mjpeg-guide开源项目,里面有摄像头这部分的代码,大家按照他的操作顺序肯定可以采集出视频数据,至于怎样测试自己这部分的代码我认为也挺重要的,我的方法是把得到的buf中的数据用刚刚提到的那个开源工程中的compress_yuyv_to_jpeg函数处理下,然后把处理得到的数据写入一个文件就得到了一幅图片,如果这幅图片可以正常打开那说明这部分代码应该没有大问题 了。接下来我们要做 的是把从mini2440采集到的图片传输到虚拟机中,这部分就是用socket编程,没有太难的部分,然后就是显示也就是上位机程序这部分我用qt做的,我用qtcreator实现的,说一下思路吧,用qt提供的对socket的支持接收从开发板传过来的数据然后存入一个文件,之后用qt加载到widget上,呵呵·····大神一看我的思路就知道我菜的要死,视频传输还有这么做的。至此这个小车的核心部分也就做完了,如果有的朋友对qt很不熟悉我推荐一个文档(Qt教程及软件(超级浅显易懂_非常适合初学者)),上面有所有你所需要的qt方面的知识。其他的就是写一个L298驱动程序,这方面应该是很简单就是控制几个io口。 说完了大体思路再说一下问题: 1、视频采集的帧数很低只有大概5帧,我把每秒采集的帧数设置成30帧也不管用,于是我认为是转码的问题,转码占用了大量cpu资源,我摄像头采集出的数据时yuyv格式的,我是在调用compress_yuyv_to_jpeg函数吧数据转换成jpeg格式数据后又发送的,这样数据量会小很多,大概只有原来的十分之一的样子。于是把这部分屏蔽掉,把转码这部分工作转到上位机上来做,但是还是这么慢。经过测试发现时摄像头采集数据时一秒钟只能采集4~5帧数据,我想要么是底层驱动的问题要么是开发板所提供的usb接口的问题,2440开发板所提供的usb接口是1.1的。当然以上两种可能都是我臆测的没有任何的依据。 2、我在写程序测试时网络传输介质使用的是网线,各方面都很正常,但是换成无线网卡后就开始出问题了,我的上位机程序只要接到开发板传来的数据就崩溃,因为对qt和c++都不是特别熟悉所以现在还没找到问题。 希望做过这方面东西的大神可以针对以上两个问题提出自己的意见,我将不胜感激。如有需要源码等请联系qq:1099467203 最后贴出我出问题的那段代码,首先强调一下程序是在这崩溃的但是问题可能在初始化网络时造成 的希望大家多多指教。我的理解是做为应用层的程序应该和硬件不相关的,为什么用网线可以用无线网卡就不行了呢。我室友告诉我可能是usb供电的问题因为usb无线网卡需要很大电流,而我买的usbhub才15块钱,这样导致摄像头电流小不正常工作。void Widget::receive_data(){
QDataStream in(tcpsocket); in.setVersion(QDataStream::Qt_4_6);
if(flag==0) { in.readRawData((char *)(&pic_size),4); ui->disLabel->setNum(pic_size); flag = 1; } else { int temp = received; received += tcpsocket->bytesAvailable(); in.readRawData((char *)&frombuf[temp],tcpsocket->bytesAvailable()); ui->numLabel->setNum(received); } if(received==pic_size) { int file_size,ret; int fd; fd = open("/root/aa.jpg",O_WRONLY|O_CREAT,0777); file_size = compress_yuyv_to_jpeg(tobuf,frombuf,received); if((ret = write(fd,tobuf,file_size))!=file_size) { qDebug()<<"write file error\n"; return ; } ::close(fd); QPixmap pix("/root/aa.jpg"); qreal width = pix.width(); qreal height = pix.height(); pix = pix.scaled(width*1.5,height*1.5); ui->picLabel->setPixmap(pix); system("rm -f /root/aa.jpg"); flag = 0; received = 0; pic_size = 0; }}程序是在红字体的那一行崩溃的。