解决Qt使用定时器播放视频过快的问题
2015-05-02 10:09
507 查看
最近在使用Qt+opencv制作一个视频播放器,可每次播放完一个视频文件,再打开另外一个时就出现第二个视频播放速度超快的问题。纠结很久一直没找到问题所在,前面一直以为是opencv获取帧速出现问题。后来发现不是,而是Qt定时器的问题。最初我把定时器的初始化放在了类的构造函数里面,然后我把它移到视频文件的捕获处,还是没能根本解决问题。
capture=VideoCapture(fileName.toLatin1().data());
//获取视频流
最终发现,原因在于视频播放结束之后并没有将对应定时器stop,以至于打开下一个视频的时候,定时器已经跑了很远的距离了,所以视频的播放需要跟上之前定时器的脚步,才会出现后续视频播放过快的现象。解决方案就是在视频流播放结束的时候同时需要调用定时器stop方法。判断视频流结束的方法是,opencv获取的视频帧为空。
capture>>Frame
if(!Frame.data)
timer.stop()
如果有重播按钮时,只需在重播按钮触发时先停用定时器,因为重播的方式是重新打开文件,需要重新初始化定时器或者重新开始定时器。
总结:Qt定时器的start方法和stop方法最好是成对存在,不能只管start而不管stop。适时的stop才能保证定时器的完美运行!
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才能保证定时器的完美运行!
相关文章推荐
- Android 使用Webview无法播放视频问题的解决办法
- ffmpeg使用记录--解决了压制的视频在安卓不播放的问题
- Window 下 Qt5 使用QMediaplayer 进行视频播放 流播放问题
- 解决Android使用SurfaceView播放视频结束后黑屏问题
- iOS开发-BUG:解决在使用MPMoviePlayerController播放视频后导航栏上移的问题
- ubuntu系统qt中播放音频和视频遇到的问题及解决方法
- Window 下 Qt5 使用QMediaplayer 进行视频播放 流播放问题
- Android中使用WebView全屏播放视频时home键不起作用的问题解决
- Qt源码重新编译QtMultimedia模块解决XP播放视频问题
- Window 下 Qt5 使用QMediaplayer 进行视频播放 流播放问题
- qt 播放音视频遇到问题的解决方法
- Android使用VideoView出现无法播放此视频问题的解决方法
- qt+ffmpeg 使用qAudioOutput播放声音,解决有沙沙的杂音问题。
- Android使用react-native-video 播放视频一直重复播放的解决方法
- 使用vlc解决在web上点击播放ts格式视频
- opencv使用笔记本摄像头获取视频问题解决
- 使用small-video-record(ffmpeg)视频压缩框架混淆后报错问题解决
- 使用SDL2播放视频,窗口无法移动,处于繁忙状态的解决办法
- 使用bootstrap之轮播插件不自动播放的问题和播放时间间隔的问题解决方法
- QT 5.9版本 使用MSVC2015编译时出现中文字符乱码问题的解决方法