// 以下为 mainwindow.cpp 的完整代码内容
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
, ui(new Ui::MainWindow)
qRegisterMetaType<std::string>();
QWidget* centralWidget = new QWidget(this);
QHBoxLayout* lay = new QHBoxLayout(centralWidget);
widget_local = new QWidget(this);
widget_remote = new QWidget(this);
lay->addWidget(widget_local);
lay->addWidget(widget_remote);
widget_local->setFixedSize(200, 200);
widget_remote->setFixedSize(200, 200);
this->setCentralWidget(centralWidget);
if (m_appid.empty() || m_uid.empty() || m_roomid.empty()) {
QMessageBox box(QMessageBox::Warning, QStringLiteral("提示"), QString("paras is empty"), QMessageBox::Ok);
//创建 EventHandler 对象,用于接收房间、引擎通知
m_handler = std::make_shared<EventHandler>();
connect(m_handler.get(), &EventHandler::sigRoomStateChanged, this, [](std::string roomid, std::string uid, int state, std::string extra_info) {
qDebug() << Q_FUNC_INFO << "roomid=" << QString::fromStdString(roomid) << ",uid=" << QString::fromStdString(uid) << ",state=" << QString::number(state);
connect(m_handler.get(), &EventHandler::sigUserPublishStreamVideo, this, [this](std::string streamId, bytertc::StreamInfo info, bool publish) {
qDebug() << Q_FUNC_INFO << "onUserPublishStreamVideo"
<< " streamId:" << QString::fromStdString(streamId)
<< " streamId:" << streamId;
bytertc::VideoCanvas cas;
cas.background_color = 0;
cas.render_mode = bytertc::RenderMode::kRenderModeFit;
cas.view = (void*)widget_remote->winId();
m_engine->setRemoteVideoCanvas(streamId.c_str(), cas);
bytertc::VideoCanvas cas;
m_engine->setRemoteVideoCanvas(streamId.c_str(), cas);
bytertc::EngineConfig engConf;
engConf.app_id = m_appid.c_str();
m_engine = bytertc::IRTCEngine::createRTCEngine(engConf, m_handler.get());
if (m_engine == nullptr) return;
m_engine->startAudioCapture();
m_engine->startVideoCapture();
bytertc::VideoCanvas cas;
cas.background_color = 0;
cas.render_mode = bytertc::RenderMode::kRenderModeFit;
cas.view = (void*)widget_local->winId();
m_engine->setLocalVideoCanvas(cas);
m_room = m_engine->createRTCRoom(m_roomid.c_str());
if (m_room == nullptr) return;
bytertc::UserInfo uinfo;
bytertc::RTCRoomConfig conf;
uinfo.extra_info = nullptr;
uinfo.uid = m_uid.c_str();
conf.is_auto_publish_audio = true; // 原为 is_publish_audio
conf.is_auto_publish_video = true; // 原为 is_publish_video
conf.is_auto_subscribe_audio = true;
conf.is_auto_subscribe_video = true;
int joinRoomResult = m_room->joinRoom(m_token.c_str(), uinfo, true, conf);
QMessageBox box(QMessageBox::Warning, QStringLiteral("加入房间状态"), QString::number(joinRoomResult), QMessageBox::Ok);
m_room->setRTCRoomEventHandler(m_handler.get());
MainWindow::~MainWindow()
m_engine->stopAudioCapture();
m_engine->stopVideoCapture();
bytertc::IRTCEngine::destroyRTCEngine();