您的位置:首页 > 编程语言 > Qt开发

解决Qt使用定时器播放视频过快的问题

2015-05-02 10:09 507 查看
       最近在使用Qt+opencv制作一个视频播放器,可每次播放完一个视频文件,再打开另外一个时就出现第二个视频播放速度超快的问题。纠结很久一直没找到问题所在,前面一直以为是opencv获取帧速出现问题。后来发现不是,而是Qt定时器的问题。最初我把定时器的初始化放在了类的构造函数里面,然后我把它移到视频文件的捕获处,还是没能根本解决问题。

                capture=VideoCapture(fileName.toLatin1().data());
                        //获取视频流

Localtimer= new QTimer(this);                           //本地视频定时器定义定时器初始化

double rate = capture.get(CV_CAP_PROP_FPS);               //获取帧率

int delay=1000/rate;                                      //每一帧之间的延迟

Localtimer->setInterval(delay);                          //每帧间隔启动一次定时器,更新图像

connect(Localtimer,SIGNAL(timeout()),this,SLOT(updateLocalImage()));  //设置时间超时更新图像的信号与槽

      最终发现,原因在于视频播放结束之后并没有将对应定时器stop,以至于打开下一个视频的时候,定时器已经跑了很远的距离了,所以视频的播放需要跟上之前定时器的脚步,才会出现后续视频播放过快的现象。解决方案就是在视频流播放结束的时候同时需要调用定时器stop方法。判断视频流结束的方法是,opencv获取的视频帧为空。

             capture>>Frame

             if(!Frame.data)

                     timer.stop()

    如果有重播按钮时,只需在重播按钮触发时先停用定时器,因为重播的方式是重新打开文件,需要重新初始化定时器或者重新开始定时器。

    总结:Qt定时器的start方法和stop方法最好是成对存在,不能只管start而不管stop。适时的stop才能保证定时器的完美运行!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: