标题:qml如何加载摄像头视频
作者:goqqdo
日期:2013-03-01 17:08
内容:
问题具体如下:(平台linux fedora 版本qt4.8.4)
开始用qml写了界面,其中一块是监控部分,qt c++下完成摄像头的视频的采集,我想将采集的图片在qml界面上显示。采取的方法是将采集到的每幅图片都保存成一个png格式的图片(video1.png)。然后在qml下用个定时器反复读取该图片路径加载。但是界面只显示第一次存储的图片,定时器是起作用的,可能是由于路径不变,图片只读取了一次。看文件夹下的图片是在不断更新的。我想问下将摄像头的视频在qml下显示出来的方法,我想过要么用个循环队列存取多幅图片用qml读取,还没试而且觉得不妥。摄像头部分c++代码是网上下载的能正常运行,是绘制在label中的,我稍微改了下程序不绘制,只存储成文件供qml读取。另外我也不知道如何qml中调用qt中的部件,比如label这种。
混编的方法是将c++类定义一个新的QML元素,头文件就不贴了。
c++部分代码:
ProcessImage::ProcessImage(QWidget *parent):QWidget(parent)
{
....
timer = new QTimer(this);
//connect(timer,SIGNAL(timeout()),this,SLOT(update()));//update()调用paintEvent函数
connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrameData()));
timer->start(30);
....
}
void ProcessImage::ReadFrameData()
{
rs = vd->get_frame((void **)&p,&len);//获取视频数据
convert_yuv_to_rgb_buffer(p,pp,640,480/*QWidget::width(),QWidget::height()*/);//转换格式yuv-rgb
frame->loadFromData((uchar *)pp,/*len*/640 * 480 * 3 * sizeof(char));//得到image
pixframe=QPixmap::fromImage(*frame,Qt::AutoColor);//将图像转换成pixmap
pixframe.save("qml/terminal/core/video1.png");//存储图像
...
}
qml部分代码:
Item {
property string videoPath1:"video1.png"
width: 780;height: 380
visible: false
Videodata{
id:videodata
}//
Timer{
..
#1 [goqqdo 03-01 17:13]
SDLCHKQ9KJ47EDFQ.jpg)
传个图,就这样,只显示第一帧然后不动了。寻求各种解决方案。
#2 [yxkaibaoma 03-01 20:08]
image会自己将读取的图片放到缓存,即使图像更改文件名不改image也不会读取。
你可以将cache设成false,然后在外部只更改sourceSize即可。
#3 [yxkaibaoma 03-01 20:18]
其实你也可以用两张图片交换显示
#4 [goqqdo 03-02 10:45]
我先试试看。
#5 [goqqdo 03-02 10:56]
将cache设成false,然后在外部只更改sourceSize。是可行的,谢谢。
不过我的这种方式实在是不可取。我看了其他帖子有qmlcamera的示例,可以去参考。