导师要求用Qt写个播放器了解下视频播放原理
视频的播放用的opengl和定时器实现,其中碰到了一些比较基础的问题:
1.GLX和Qt窗口的绑定
2.播放过程中界面无法及时响应按键操作(互斥锁)
3.对界面事件的重写(如moveEvent、closeEvent等)
4.全屏播放
本文就写一下3和4碰到的问题和解决办法
播放过程中播放进度条要实现1.任意时间点的跳转 2.连续拖动
但是QSlider本身无法同时实现,要实现1要重写mouseMoveEvent,但这样会造成无法连续拖动,为了方便我重写了eventFilter过滤器,需要注意的是事件过滤器一次只能过滤一种事件,如果既要press事件又要move事件只能分两次,不然都过滤不到
bool PlayerUI::eventFilter(QObject *watch, QEvent *event)
{
if (ui->slider == watch)
{
if (NULL == m_pManager)
{
return false;
}
QMouseEvent *mev = static_cast<QMouseEvent*>(event);
if (QEvent::MouseButtonPress == event->type() && ui->slider->isEnabled())
{
int size = m_stPara.nWidth * m_stPara.nHeight;
//根据比例计算新进度条的位置
int pos = m_pManager->GetFrameNum(size) * mev->x() / width();
ui->slider->setValue(pos);
//设定新的位置
SilderChange(pos);
}
else if (QEvent::MouseMove == event->type() && ui->slider->isEnabled())
{
int size = m_stPara.nWidth * m_stPara.nHeight;
int pos = m_pManager->GetFrameNum(size) * mev->x() / width();
ui->slider->setValue(pos);
SilderChange(pos);
}
else
{
//to do nothing
}
}
else
{
return QWidget::eventFilter(watch, event);
}
}
全屏播放时可以用showFullScreen来实现,但是只能把主窗口全屏,因此先对整个播放界面设定GridLayout,全屏的同时隐藏其他控件,播放界面会自动扩充到整个屏幕,实现全屏播放。
如果实现了双击全屏,为了精确起见,可以设定只在播放界面双击有效,不然双击任意位置都会全屏。