pro文件添加QT +=multimedia multimediawidgets;
UI界面拖拽一个QWidget,右键提升为QVideoWidget;
定义QMediaPlayer对象
QMediaPlayer *pMediaPlayer0;
pMediaPlayer0 = new QMediaPlayer(this);
ui->videowidget->setAspectRatioMode(Qt::IgnoreAspectRatio);//自适应铺满界面
pMediaPlayer0->setVideoOutput(ui->videowidget);//设置视频输出到QVideoWidget
ui->videowidget->setFullScreen(true); //全屏显示
pMediaPlayer0->setVolume(50);
pMediaPlayer0->setMedia(QUrl::fromLocalFile("./video/loop.mp4"));//加载视频文件
pMediaPlayer0->play();//播放视频
也可以通过QMediaPlaylist的方式播放,创建一个播放列表
mediaPlayerlist = new QMediaPlaylist(pMediaPlayer0);
mediaPlayerlist->addMedia(QUrl::fromLocalFile("./video/loop.mp4"));
mediaPlayerlist->setCurrentIndex(0);
mediaPlayerlist->setPlaybackMode(QMediaPlaylist::Loop);//循环播放
pMediaPlayer0->setPlaylist(pMediaPlayerlist);
pMediaPlayer0->play();
记录两个问题,以及解决方案
一、切换视频时加载时间过长
针对固定的视频,切换视频等待时间过长,有时几秒钟也是不可接受的,推荐一种解决方法,定义多个QMediaPlayer成员对象,每个对象只setMedia一个视频文件,同时也定义多个QVideoWidget与QMediaPlayer一一对应,当播放不同视频时对其他QVideoWidget进行隐藏。
二、QMediaPlayer播放视频短暂黑屏
当播放视频或切换视频时,即使视频已加载,还是会出现开头短暂黑屏现象,在某些展示性的窗口这种短暂黑屏也无法接受;
这里利用QT信号槽机制,当视频播放位置改变时QMediaPlayer会发送信号positionChanged(qint64 position),position是当前播放时间,单位毫秒,当视频播放play()时,如果position为0,则是黑屏状态,只有当position大于0时,才是真正的播放视频;
我们可以把界面设置一个背景图片,图片为视频开头的画面,这里注意QVideoWidget没法设置背景图,可以在后面的界面设置背景图,当position为0时隐藏QVideoWidget,当position大于0时显示QVideoWidget。
ui->videowidget->setVisible(false);
connect(pMediaPlayer0,&QMediaPlayer::positionChanged,this,&VideoPlayDlg::updatePosition0);
void VideoPlayDlg::updatePosition0(qint64 position)
{
if(position > 0)
{
ui->videowidget->setVisible(true);
}
//不使用QMediaPlaylist时,实现循环播放
if(position == pMediaPlayer0->duration())
{
if(pMediaPlayer0->duration() != 0)
{
pMediaPlayer0->play();
}
}
}
pMediaPlayer0->duration()可获得视频的总时长,当视频还没有加载完成时返回为0,因此排除pMediaPlayer0->duration() == 0的情况。