跟着B站的一位UP敲一个视频播放器的小项目,代码明明是一模一样,但是就是报错,显示No member named 'xxxxxxx' in 'xxxxxxx'。好不容易找到QT6版本的替代方法,视频正常播放但是一直没有声音。最后发现是没有设置音频输出设备的问题。
解决方案:
1.在工程文件中配置 multimediawidgets 媒体组件
QT += multimediawidgets
2.引入管理和控制音频输出的头文件 <QAudioOutput>
#include <QAudioOutput>
3.在类的头文件中声明QAudioOutput类的指针对象
QAudioOutput *audiooutput;
4.在源文件中实例化QAudioOutput对象,并将音频输出设备与媒体对象关联,之后播放的视频中也会正常播放音频
//实例化音频输出对象
audiooutput = new QAudioOutput(this);
//将音频输出设备与player对象关联
player -> setAudioOutput(audiooutput);
附上全部代码
widgetshiping.h
#ifndef WIDGETSHIPING_H
#define WIDGETSHIPING_H
#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QAudioOutput>
#include <QFileDialog>
#include <QDir>
QT_BEGIN_NAMESPACE
namespace Ui { class WidgetShiPing; }
QT_END_NAMESPACE
class WidgetShiPing : public QWidget
{
Q_OBJECT
public:
WidgetShiPing(QWidget *parent = nullptr);
~WidgetShiPing();
QMediaPlayer *player;
QAudioOutput *audiooutput;
QVideoWidget *videowidget;
private:
Ui::WidgetShiPing *ui;
};
#endif // WIDGETSHIPING_H
main.cpp
#include "widgetshiping.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
WidgetShiPing w;
w.show();
return a.exec();
}
widgetshiping.cpp
#include "widgetshiping.h"
#include "ui_widgetshiping.h"
WidgetShiPing::WidgetShiPing(QWidget *parent)
: QWidget(parent)
, ui(new Ui::WidgetShiPing)
{
ui->setupUi(this);
//实例化对象
//播放媒体对象
player = new QMediaPlayer(this);
//音频输出对象
audiooutput = new QAudioOutput(this);
videowidget = new QVideoWidget(this);
videowidget->resize(this->size());
//将音频输出设备与player对象关联
player -> setAudioOutput(audiooutput);
//将视频组件与player对象关联
player -> setVideoOutput(videowidget);
//选择播放文件
QString filePath = QFileDialog::getOpenFileName(
this,
"请选择视频文件",
QDir::homePath(),
"视频文件 (*.mp4 *.avi *.mkv *.mov);;所有文件 (*)"
);
// 设置视频的源文件
player->setSource(QUrl::fromLocalFile(filePath));
// 播放视频
player->play();
}
WidgetShiPing::~WidgetShiPing()
{
delete ui;
}
刚开始学,自己跟着敲卡了好久,感觉版本过度好痛苦。感觉QT6能找到的资源也很少,希望能帮到遇到同样问题的人。
如果写的有问题的话希望看到的大佬指点以下,非常感谢!