解决webrtc前端replaceTrack断流问题
在前端replaceTrack时,会发送rtcp byte消息,而ZLM目前的处理是收到bye就关闭连接,所以前端新的流就推不上来。
查看源码大约760行左右的处理rtcp的函数的
case RtcpType::RTCP_BYE: {
// 对方汇报停止发送rtp
RtcpBye *bye = (RtcpBye *)rtcp;
for (auto ssrc : bye->getSSRC()) {
auto it = _ssrc_to_track.find(*ssrc);
if (it == _ssrc_to_track.end()) {
WarnL << "未识别的bye rtcp包:" << rtcp->dumpString();
continue;
}
_ssrc_to_track.erase(it);
}
onShutdown(SockException(Err_eof, "rtcp bye message received"));
break;
}
onShutdown会关闭掉当前的会话。注释掉此行代码重新测试即可
void WebRtcTransportImp::onShutdown(const SockException &ex) {
WarnL << ex.what();
unrefSelf();
for (auto &pr : _history_sessions) {
auto session = pr.second.lock();
if (session) {
session->shutdown(ex);
}
}
}