新浪微博
腾讯微博
会员列表
统计排行
基本信息
到访IP统计
管理团队
管理统计
在线会员
会员排行
版块排行
帖子排行
标签排行
帮助
下拉
用户名
电子邮箱
用户名
密 码
记住登录
登录
找回密码
注册
快捷通道
关闭
您还没有登录,快捷通道只有在登录后才能使用。
立即登录
还没有帐号? 赶紧
注册一个
首页
论坛
Qt下载
作品展
群组
个人中心
捐赠、管理与开发
邮件订阅
帖子
文章
日志
用户
版块
群组
帖子
搜索
QTCN开发网
>
Qt基础编程
>
qt视频实时显示问题
发帖
回复
返回列表
新帖
4943
阅读
3
回复
[提问]
qt视频实时显示问题
[复制链接]
上一主题
下一主题
离线
cesc1988
UID:124232
注册时间
2011-11-08
最后登录
2013-11-05
在线时间
25小时
发帖
16
搜Ta的帖子
精华
0
金钱
160
威望
26
贡献值
0
好评度
16
访问TA的空间
加好友
用道具
新手上路
关闭
个人中心可以申请新版勋章哦
立即申请
知道了
加关注
发消息
只看楼主
倒序阅读
楼主
发表于: 2011-11-10
在linux下用v4l2采集
视频
但是程序运行后内存占用率越来越高 然后死机
这是什么
问题
啊
求指教
一下是v4l2代码
#include "videodevice.h"
#include<QtDebug>
#include<QImage>
VideoDevice::VideoDevice(
QString
dev_name)
{
this->dev_name = dev_name;
this->fd = -1;
this->buffers = NULL;
this->n_buffers = 0;
this->index = -1;
}
int VideoDevice::open_device()
{
fd = open(dev_name.toStdString().c_str(), O_RDWR/*|O_NONBLOCK*/, 0);
// fd = open(dev_name.toStdString().c_str(), O_RDWR|O_NONBLOCK, 0);
if(-1 == fd)
{
qDebug("not open device successfully");
return -1;
}
qDebug("open device successfully");
return 0;
}
int VideoDevice::close_device()
{
if(-1 == close(fd))
{
qDebug("fd close failed");
return -1;
}
return 0;
}
int VideoDevice::init_device()
{
v4l2_capability cap;
v4l2_format fmt;
qDebug("init star");
if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap))
{
if(EINVAL == errno)
{
qDebug()<<dev_name<<" is no V4l2 device";
}
else
{
qDebug("VIDIOC_QUERYCAP is wrong");
}
return -1;
}
if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
{
qDebug()<<dev_name<<" is no video capture device";
return -1;
}
if(!(cap.capabilities & V4L2_CAP_STREAMING))
{
qDebug()<<dev_name<<" does
not
support streaming i/o";
return -1;
}
struct v4l2_fmtdesc fmt1;
int ret;
memset(&fmt1, 0, sizeof(fmt1));
fmt1.index = 0;
fmt1.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
while ((ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmt1)) == 0)//显示所有支持的
格式
;
{
fmt1.index++;
qDebug()<<"pixelformat ="<<char(fmt1.pixelformat & 0xFF)<<char((fmt1.pixelformat >> 8) & 0xFF)
<<char((fmt1.pixelformat >> 16) & 0xFF)<<char((fmt1.pixelformat >> 24) & 0xFF)
;
}
CLEAR(fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = WIDTH;
fmt.fmt.pix.height = HEIGHT;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if(-1 == ioctl(fd, VIDIOC_S_FMT, &fmt))
{
qDebug("VIDIOC_S_FMT is not setted");
return -1;
}
return 0;
}
int VideoDevice::init_mmap()
{
v4l2_requestbuffers req;
CLEAR(req);
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if(-1 == ioctl(fd, VIDIOC_REQBUFS, &req))
{
if(EINVAL == errno)
{
qDebug()<<dev_name<<" does not support memory mapping";
return -1;
}
else
{
qDebug("VIDIOC_REQBUFS is wrong");
return -1;
}
}
if(req.count < 2)
{
qDebug()<<dev_name<<"Insufficient buffer memory on ";
return -1;
}
buffers = (buffer*)calloc(req.count, sizeof(*buffers));
if(!buffers)
{
qDebug("out of memory");
return -1;
}
for(n_buffers = 0; n_buffers < req.count; ++n_buffers)
{
v4l2_buffer buf;
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;
if(-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
{
qDebug("VIDIOC_QUERYBUF is wrong");
return -1;
}
buffers[n_buffers].length = buf.length;
buffers[n_buffers].start =
mmap(NULL, // start anywhere
buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd, buf.m.offset);
if(MAP_FAILED == buffers[n_buffers].start)
{
qDebug("mmap is wrong");
return -1;
}
}
return 0;
}
int VideoDevice::start_capturing()
{
unsigned int i;
for(i = 0; i < n_buffers; ++i)
{
v4l2_buffer buf;
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
buf.index = i;
if(-1 == ioctl(fd, VIDIOC_QBUF, &buf))
{
qDebug("VIDIOC_QBUF is wrong");
return -1;
}
}
v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(-1 == ioctl(fd, VIDIOC_STREAMON, &type))
{
qDebug("VIDIOC_STREAMON is wrong");
return -1;
}
return 0;
}
int VideoDevice::stop_capturing()
{
v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(-1 == ioctl(fd, VIDIOC_STREAMOFF, &type))
{
emit display_error(tr("VIDIOC_STREAMOFF: %1").arg(QString(strerror(errno))));
return -1;
}
return 0;
}
int VideoDevice::uninit_device()
{
unsigned int i;
for(i = 0; i < n_buffers; ++i)
{
if(-1 == munmap(buffers
.start, buffers
.length))
{
emit display_error(tr("munmap: %1").arg(QString(strerror(errno))));
return -1;
}
}
free(buffers);
close(fd);
return 0;
}
QImage* VideoDevice::get_frame()
{
v4l2_buffer queue_buf;
CLEAR(queue_buf);
queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queue_buf.memory = V4L2_MEMORY_MMAP;
if(-1 == ioctl(fd, VIDIOC_DQBUF, &queue_buf))
{
switch(errno)
{
case EAGAIN:
qDebug("dqbuf");
case EIO:
qDebug("EIO wrong");
default:
qDebug("VIDIOC_DQBUF is wrong");
}
}
// char *picturename="pic.jpg";
// if((file_fd = fopen(picturename, "wb+"))==NULL)
// {
// qDebug("create picture wrong");
// }
qDebug()<<buffers[queue_buf.index].length;
//fwrite(buffers[queue_buf.index].start, buffers[queue_buf.index].length, 1, file_fd);
QImage *captureimage=new
QImage
(WIDTH,HEIGHT,QImage::Format_RGB32);
uchar *bit=(uchar*)(buffers[queue_buf.index].start);
int i=0,r,g,b,y0,y1,u0,v0,r0,g0,b0,r1,g1,b1;QRgb *point;
for(int y=0;y<HEIGHT;y++)
for(int x=0;x<WIDTH;x=x+2)
{
y0=bit
;
u0=bit[i+1];
y1=bit[i+2];
v0=bit[i+3];
// r0=y0+1.14*v0+0.5;
// g0=y0-0.39*u0-0.58*v0+0.5;
// b0=y0+2.03*u0+0.5;
// r1=y1+1.14*v0+0.5;
// g1=y1-0.39*u0-0.58*v0+0.5;
// b1=y1+2.03*u0+0.5;
//////first way///////////
/* r0=y0+1.4075*(v0-128)+0.5;
g0=y0-0.3455*(u0-128)-0.7169*(v0-128)+0.5;
b0=y0+1.779*(u0-128)+0.5;
r1=y1+1.4075*(v0-128)+0.5;
g1=y1-0.3455*(u0-128)-0.7169*(v0-128)+0.5;
b1=y1+1.779*(u0-128)+0.5;*/
//point=(QRgb*)(captureimage->scanLine(y)+x);
//////second way///
u0=u0-128;
v0=v0-128;
int rd=v0+((v0*103)>>8);
int gd=((u0*88)>>8)+((v0*183)>>8);
int bd=u0+((u0*198)>>8);
r0=y0+rd;
g0=y0-gd;
b0=y0+bd;
r1=y1+rd;
g1=y1-gd;
b1=y1+bd;
if(r0>255) r0=255;
if(r0<0) r0=0;
if(r1>255) r1=255;
if(r1<0) r1=0;
captureimage->setPixel(x,y,qRgb(r0,g0,b0));
// *point=qRgb(r0,g0,b0);
captureimage->setPixel(x+1,y,qRgb(r1,g1,b1));
// point=(QRgb*)(captureimage->scanLine(y)+x+1);
//*point=qRgb(r1,g1,b1);
i=i+4;
}
qDebug()<<y0<<u0<<v0<<r0<<g0<<b0<<i;
if(ioctl(fd, VIDIOC_QBUF, &queue_buf)==-1) //再将其入列
qDebug("failture VIDIOC_QBUF");
/**** 修改的地方********/
//free(&queue_buf);
/***********/
return captureimage;
}
int VideoDevice::unget_frame()
{
if(index != -1)
{
v4l2_buffer queue_buf;
CLEAR(queue_buf);
queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queue_buf.memory = V4L2_MEMORY_MMAP;
queue_buf.index = index;
if(-1 == ioctl(fd, VIDIOC_QBUF, &queue_buf))
{
emit display_error(tr("VIDIOC_QBUF: %1").arg(QString(strerror(errno))));
return -1;
}
return 0;
}
return -1;
}
调用open_device->init_device->init_map->start_capturing->get_frame开始采集
共
条评分
回复
举报
分享到
淘江湖
新浪
QQ微博
QQ空间
开心
人人
豆瓣
网易微博
百度
鲜果
白社会
飞信
离线
wxj120bw
UID:65192
注册时间
2008-09-24
最后登录
2018-04-13
在线时间
1588小时
发帖
1654
搜Ta的帖子
精华
0
金钱
20315
威望
1679
贡献值
0
好评度
1678
访问TA的空间
加好友
用道具
精灵王
加关注
发消息
只看该作者
1楼
发表于: 2011-11-10
回 楼主(cesc1988) 的帖子
get_frame的captureimage你释放吗
共
条评分
回复
举报
离线
cesc1988
UID:124232
注册时间
2011-11-08
最后登录
2013-11-05
在线时间
25小时
发帖
16
搜Ta的帖子
精华
0
金钱
160
威望
26
贡献值
0
好评度
16
访问TA的空间
加好友
用道具
新手上路
加关注
发消息
只看该作者
2楼
发表于: 2011-11-25
回 1楼(wxj120bw) 的帖子
没有 但是我要返回这个图片啊 释放了就得不到了啊
共
条评分
回复
举报
离线
wxj120bw
UID:65192
注册时间
2008-09-24
最后登录
2018-04-13
在线时间
1588小时
发帖
1654
搜Ta的帖子
精华
0
金钱
20315
威望
1679
贡献值
0
好评度
1678
访问TA的空间
加好友
用道具
精灵王
加关注
发消息
只看该作者
3楼
发表于: 2011-11-25
回 2楼(cesc1988) 的帖子
用完就释放
共
条评分
回复
举报
发帖
回复
返回列表
http://www.qtcn.org/bbs
访问内容超出本站范围,不能确定是否安全
继续访问
取消访问
快速回复
限100 字节
您目前还是游客,请
登录
或
注册
进入高级模式
文字颜色
发 布
回复后跳转到最后一页
上一个
下一个
关闭
补充发布信息
验证码:
发 布
隐藏
快速跳转
站务及资讯
网站公告
新闻资讯
Qt官方发布
网站管理
Qt应用及资源
Qt 作品展
Qt代码秀
Qt应用版
Qt技术讨论区
Qt安装与发布
Qt中文处理
Qt基础编程
Qt QML开发
Qt嵌入式开发
Qt移动平台开发
其它技术开发讨论区
Qt图书专区
《C++ GUI Qt 4编程》(第2版)专栏
《Qt高级编程》专栏
《零基础学Qt4编程》专栏
《Qt设计模式》(第2版) 图书专栏
Python Qt GUI快速编程
Qt项目开发区
天池项目
Qt开放平台开发库
机械CAD
扇贝词典
非活跃项目区
社区中心
帖子回收站(Trash)
招聘、求职、供求、广告等
休闲娱乐
关闭
关闭
选中
1
篇
全选