// 以下为 mainwindow.cpp 的完整代码内容
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
, ui(new Ui::MainWindow)
qDebug() << Q_FUNC_INFO;
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, QString("Warning"), QString("paras is empty"), QMessageBox::Ok);
m_handler = std::make_shared<EventHandler>();
connect(m_handler.get(), &EventHandler::sigRoomStateChanged, this, [](QString roomid, QString uid, int state, QString extra_info) {
qDebug() << Q_FUNC_INFO << "onRoomStateChanged roomid=" << (roomid) << ",uid=" << (uid) << ",state=" << QString::number(state);
connect(m_handler.get(), &EventHandler::sigUserPublishStreamVideo, this, [this](QString streamId, bytertc::StreamInfo info, bool publish) {
qDebug() << Q_FUNC_INFO << "onUserPublishStreamVideo"
<< " 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.toStdString().c_str(), cas);
bytertc::VideoCanvas cas;
m_engine->setRemoteVideoCanvas(streamId.toStdString().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_publish_audio = true;
conf.is_publish_video = true;
conf.is_auto_subscribe_audio = true;
conf.is_auto_subscribe_video = true;
m_room->setRTCRoomEventHandler(m_handler.get());
m_room->joinRoom(m_token.c_str(), uinfo, true, conf);
MainWindow::~MainWindow()
m_engine->stopAudioCapture();
m_engine->stopVideoCapture();
bytertc::IRTCEngine::destroyRTCEngine();