/// description回调 m_peerConnection->onLocalDescription([this](const rtc::Description &description) { auto descriptionToString = [](rtc::Description::Type type) { switch (type) { case rtc::Description::Type::Unspec: return"Unspec"; case rtc::Description::Type::Offer: return"Offer"; case rtc::Description::Type::Answer: return"Answer"; case rtc::Description::Type::Pranswer: return"Pranswer"; case rtc::Description::Type::Rollback: return"Rollback"; default: return"Unknown"; } }; WRITE_LOG("WebRTC PeerConnection description: %s", descriptionToString(description.type())); }); //// PC State回调 m_peerConnection->onStateChange([this](rtc::PeerConnection::State state) { auto stateToString = [](rtc::PeerConnection::State s) { switch (s) { case rtc::PeerConnection::State::New: return"New"; case rtc::PeerConnection::State::Connecting: return"Connecting"; case rtc::PeerConnection::State::Connected: return"Connected"; case rtc::PeerConnection::State::Disconnected: return"Disconnected"; case rtc::PeerConnection::State::Failed: return"Failed"; case rtc::PeerConnection::State::Closed: return"Closed"; default: return"Unknown"; } }; WRITE_LOG("WebRTC PeerConnection state changed: %s", stateToString(state));
if (state == rtc::PeerConnection::State::Connected) { emit publisherStarted(); } elseif (state == rtc::PeerConnection::State::Failed) { emit errorOccurred("WebRTC connection failed."); stopPublishing(); } }); /// Signaling State回调 m_peerConnection->onSignalingStateChange([](rtc::PeerConnection::SignalingState state) { auto stateToString = [](rtc::PeerConnection::SignalingState s) { switch (s) { case rtc::PeerConnection::SignalingState::Stable: return"Stable"; case rtc::PeerConnection::SignalingState::HaveLocalOffer: return"HaveLocalOffer"; case rtc::PeerConnection::SignalingState::HaveRemoteOffer: return"HaveRemoteOffer"; case rtc::PeerConnection::SignalingState::HaveLocalPranswer: return"HaveLocalPranswer"; default: return"Unknown"; } }; WRITE_LOG("Signaling state changed: %s", stateToString(state)); }); /// ICE State回调 出错点 m_peerConnection->onGatheringStateChange([this](rtc::PeerConnection::GatheringState state) { auto stateToString = [](rtc::PeerConnection::GatheringState s) { switch (s) { case rtc::PeerConnection::GatheringState::New: return"New"; case rtc::PeerConnection::GatheringState::InProgress: return"InProgress"; case rtc::PeerConnection::GatheringState::Complete: return"Complete"; default: return"Unknown"; } }; WRITE_LOG("WebRTC ICE Gathering state changed: %s", stateToString(state));
if (state == rtc::PeerConnection::GatheringState::Complete) { auto description = m_peerConnection->localDescription(); if (description.has_value()) { WRITE_LOG("ICE Gathering complete. Sending offer to server."); std::string sdp_offer = description.value(); // QMetaObject::invokeMethod(this, [this, sdp_offer]() { // sendOfferToSignalingServer(sdp_offer); // }, Qt::QueuedConnection); sendOfferToSignalingServer(sdp_offer); } else { WRITE_LOG("CRITICAL: ICE Gathering is complete, but local description is NOT available."); emit errorOccurred("Failed to get local SDP description after ICE gathering."); } } });