QMediaPlayer+QVideoWidget+QAudioOutput实现一个简单视频播放器-Qt6.8

此篇是我在观看使用nginx搭建音视频点播服务器 - seedoubleu - 博客园后,想着使用qt widget写的一个简单播放器

完成nginx搭建音视频点播服务器的话,我推荐使用ffplay进行验证.再推荐一个视频【音视频】FFmpeg音视频入门到精通+实战课_哔哩哔哩_bilibili

同时推荐一个好用的视频下载工具(支持bilibili视频下载)KurtBestor/Hitomi-Downloader: 🍰 Desktop utility to download images/videos/music/text from various websites, and more.

下图是最终写出来的界面(一共就俩界面文件,一个是displayVideo播放视频窗口,一个是videocontrolbar的视频控制栏(详细代码查看my_learnt/DisplayVideo at main · haoyouxiaoju/my_learnt)

  • 如果有其他不懂的地方可以私信我,看到的话会回复

其中controlbar简单的使用designer拖拽出来!

这里只写一些注意事项:

我使用的是qt6.8 同时项目也是cmake项目

  • 在使用qrc管理资源时,你可能会发现QFile没法找到qrc管理的文件这时候你得在cmakeLists.txt中查看
# 启用 Qt 资源支持
set(CMAKE_AUTORCC ON)  # 必须开启(否则qrc文件无法参与编译)
  • QVideoWidget是一个特殊的渲染widget,需要设置一下鼠标穿透
setAttribute(Qt::WA_TransparentForMouseEvents, true);
  • 同时使用过程中发现视频开头会黑屏
//写这个的原因是以为视频开头会黑屏,如果直接设置player的position为0不能解决
//通过尝试,设置105刚刚好
//可能跟视频的关键帧有关吧
QTimer* timer = new QTimer;
connect(timer, &QTimer::timeout, [=]() {
	qDebug() << "Media status:" << player->mediaStatus();
	qDebug() << "是否支持seek:" << player->isSeekable(); // 此时再检查
	if (player->isSeekable() == true) {
		player->setPosition(105);
		qDebug() << "durantion" << player->duration();
		timer->stop();
        timer->deleteLater();
	}
	});
timer->start(1000); // 每 100ms 检查一次 
  • 这里的话是因为v_widget和controlBar没有挂靠在DisplayVideo,是popup所以在移动和resize DisplayVideo的时候要重新设置v_widget和controlBar,提示一下如果构造函数中new出来的widget没有挂靠在其他widget的话记得在析构函数中delete
void DisplayVideo::resizeEvent(QResizeEvent * event)
{
    QWidget::resizeEvent(event);
    v_widget->resize(event->size());
	bar->resize(QSize(event->size().width(), bar->height()));
    QPoint point = v_widget->mapToGlobal(QPoint(0, 0));
	bar->move(point.x(), point.y() + v_widget->height() - bar->height());
}

void DisplayVideo::moveEvent(QMoveEvent* event)
{
    QWidget::moveEvent(event);
    //if (bar->isVisible()) {
		bar->move(event->pos().x(), event->pos().y() + v_widget->height() - bar->height());
    //}
}
  • 设置视频播放速度使用QCombobox,在点击combobox时出现异常,controlbar会hide所以添加了事件过滤
// controlBar的构造函数添加
ui.comboBox->installEventFilter(this);

bool VideoControlBar::eventFilter(QObject* obj, QEvent* event)
{
	if (obj == ui.comboBox && event->type() == QEvent::MouseButtonPress) {
		QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
		if (mouseEvent->button() == Qt::LeftButton) {
			// 阻止事件继续传播
			event->accept();
			ui.comboBox->showPopup();
			return true;
		}
	}
	return QWidget::eventFilter(obj, event);
}
  • 我现在还没找到解决方法一个问题就是设置background-color:rgba没有效果,如果你知道怎么解决,请告诉我

原创作者: hyxj 转载于: https://www.cnblogs.com/hyxj/p/18906603
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值