当前位置:网站首页>基于Webrtc和Janus的多人视频会议系统开发7 - publish和subscribe声音设备冲突导致对方听不到声音
基于Webrtc和Janus的多人视频会议系统开发7 - publish和subscribe声音设备冲突导致对方听不到声音
2022-08-04 05:32:00 【睏哥RTC】
这里说下C++原生SDK开发过程遇到一个比较大的坑:在只有publish时,对方(WEB)拉流是可以听到我方的声音的,但是增加了subscribe对方的流后,对方就听不到我方的声音了,这个问题查了比较久,专门写出来供大家参考避坑。
问题产生的原因在于:windows音频部分默认内部开启了AEC功能,但必须要求先初始化Playout再初始化Record.由于目前推流是不需要初始化Playout,导致的Record无法初始化通过。
解决的方法:目前采用的方式是"篡改" sdp 把Playout初始化
void RtcConnection::onJanusPeerSdp(std::string sdptype, std::string sdp)
{
webrtc::SdpParseError error;
rtc::Optional<SdpType> type_maybe = webrtc::SdpTypeFromString(sdptype);
if (!type_maybe) {
RTC_LOG(LS_ERROR) << "Unknown SDP type: " << sdptype;
return;
}
SdpType type = *type_maybe;
if (is_myself()) {
//TODO windows音频部分默认内部开启了AEC功能,但必须要求先初始化Playout再初始化Record.由于目前推流是不需要初始化Playout
//导致的Record无法初始化通过,目前采用的方式是"篡改" sdp 把Playout初始化。
blog(emLOG_INFO," %s is_myself() ==true ",__func__);
webrtc::JsepSessionDescription jdesc(type);
webrtc::SdpDeserialize(sdp, &jdesc, NULL);
auto audio_desc = (jdesc.description())->GetContentByName("audio")->media_description();
audio_desc->as_audio()->set_direction(webrtc::RtpTransceiverDirection::kSendRecv);
cricket::StreamParams stream_;
stream_.add_ssrc(0x12345678);
stream_.cname = rtc::CreateRandomString(8);
std::vector<std::string> vec_;
vec_.push_back("local_fake_audio");
stream_.set_stream_ids(vec_);
stream_.id = "local_fake_stream";
audio_desc->as_audio()->AddStream(stream_);
jdesc.ToString(&sdp);
}
if (!InitializePeerConnection())
{
///onError callback
return;
}
std::unique_ptr<webrtc::SessionDescriptionInterface> session_description = webrtc::CreateSessionDescription(type, sdp, &error);
if (!session_description) {
blog(emLOG_WARNING, "%s Can't parse received session description message. SdpParseError was: %s",__func__ ,error.description.c_str() );
return;
}
peer_connection_->SetRemoteDescription(DummySetSessionDescriptionObserver::Create(), session_description.release());
if (type == SdpType::kOffer) {
peer_connection_->CreateAnswer(this, NULL);
}
}
到这篇文章,webrtc的基础入门Janus原生c++ SDK开发就结束了,后面是如何一步步改造,把整个系统的优化改进,做成一个可实用的实时会议系统。
边栏推荐
- Amazon Cloud Technology Build On 2022 - AIot Season 2 IoT Special Experiment Experience
- Brief description of database and common operation guide
- Cut the hit pro subtitles export of essays
- AWS使用EC2降低DeepRacer的训练成本:DeepRacer-for-cloud的实践操作
- MNIST handwritten digit recognition, sorted by from two to ten
- Deep learning, "grain and grass" first--On the way to obtain data sets
- 彻底删除MySQL教程
- 结构体内存对齐-C语言
- Object.requireNonNull 方法说明
- [日常办公][杂项][vscode]tab space
猜你喜欢
随机推荐
Shell脚本执行的三种方式
FAREWARE ADDRESS
MySQL存储过程学习笔记(基于8.0)
strlen 转义字符
最全的最详细的指针讲解(C语言)
Usage of SFTP
Janus转发丢包导致音视频不同步原因分析
结构体内存对齐-C语言
Vmmem 进程(WSL2)消耗内存巨大
Socket编程详解
LeetCode_22_Apr_2nd_Week
Fabric v1.1 环境搭建
FAREWARE ADDRESS
亚马逊云科技Build On-Amazon Neptune基于知识图谱的推荐模型构建心得
文件权限管理 ugo
[日常办公][ssh]cheatsheet
Pipe redirection
[Daily Office][Miscellaneous][vscode]tab space
Install Minikube Cluster in AWS-EC2
Amazon Cloud Technology Build On-Amazon Neptune's Knowledge Graph-Based Recommendation Model Building Experience