webrtc 代码学习(三十四) SetLocal 和 SetRemote

SetLocal 和 SetRemote
作者:LanPZzzz

1. 获取到 offer, SetRemoteDescription,然后CreateAnswer

-> PeerConnection::SetRemoteDescription
->PeerConnection::ApplyRemoteDescription, 这里的主要参照是 offer 中的 sdp
->PeerConnection::UpdateTransceiversAndDataChannels
-> new_session 中有 offer 信息, const ContentInfos& new_contents = new_session.description()->contents(); 中 old_local_description 和 old_remote_description 都是null
-> for (size_t i = 0; i < new_contents.size(); ++i)
-> PeerConnection::AssociateTransceiver
-> PeerConnection::GetAssociatedTransceiver 根据 mid 从 transceivers_ 获取 transceiver,mid = content.name, sdp 中 a=mid:0。(代码1),可能找不到
-> 如果上面找不到 transceiver, RtpTransceiverDirectionHasRecv 是否是有Recv的, 如果是 PeerConnection::FindAvailableTransceiverToReceive 根据 type 值找
-> 找不到,就在重新创建 transceiver
->   transceiver->internal()->set_mid(content.name); transceiver->internal()->set_mline_index(mline_index); 设置
->
->PeerConnection::UpdateTransceiverChannel 设置Channel, 如果原先的没有,创建VoiceChannel 或者 VideoChannel
->
->
->
-> PeerConnection::UpdateSessionState
-> 如果是IsUnifiedPlan, for (auto transceiver : transceivers_) (代码2)
->PeerConnection::FindMediaSectionForTransceiver
->     return sdesc->description()->GetContentByName(transceiver->internal()->mid()); 根据 transceiver 的mid 获取 ContentInfo,因为上面已经设置了可用的 transceiver 的mid,这里就是找上面可用的,不可用就不要了
->
->
-> for (auto transceiver : now_receiving_transceivers) 经过代码2,获取出可用的 transceiver
-> StatsCollector::AddTrack
-> CreateTrackReport
->
-> Conductor::OnAddTrack,回调给外面
->
->
->
->
->
->

代码1

PeerConnection::FindAvailableTransceiverToReceive
。。。 
  for (auto transceiver : transceivers_) {
    if (transceiver->media_type() == media_type &&
        transceiver->internal()->created_by_addtrack() && !transceiver->mid() &&
        !transceiver->stopped()) {
      return transceiver;
    }
  }
  。。。。

代码2

    for (auto transceiver : transceivers_) {
      根据上面的 mid 获取 content,获取到的是可用的
      const ContentInfo* content =
          FindMediaSectionForTransceiver(transceiver, remote_description());
      if (!content) {
        continue;
      }
      const MediaContentDescription* media_desc = content->media_description();
      RtpTransceiverDirection local_direction =
          RtpTransceiverDirectionReversed(media_desc->direction());
      // From the WebRTC specification, steps 2.2.8.5/6 of section 4.4.1.6 "Set
      // the RTCSessionDescription: If direction is sendrecv or recvonly, and
      // transceiver's current direction is neither sendrecv nor recvonly,
      // process the addition of a remote track for the media description.
      
      获取 stream
      std::vector<std::string> stream_ids;
      if (!media_desc->streams().empty()) {
        // The remote description has signaled the stream IDs.
        stream_ids = media_desc->streams()[0].stream_ids();
      }
      if (RtpTransceiverDirectionHasRecv(local_direction) &&
          (!transceiver->fired_direction() ||
           !RtpTransceiverDirectionHasRecv(*transceiver->fired_direction()))) {
        RTC_LOG(LS_INFO) << "Processing the addition of a new track for MID="
                         << content->name << " (added to "
                         << GetStreamIdsString(stream_ids) << ").";

        std::vector<rtc::scoped_refptr<MediaStreamInterface>> media_streams;
        枚举stream
        for (const std::string& stream_id : stream_ids) {
          rtc::scoped_refptr<MediaStreamInterface> stream =
              remote_streams_->find(stream_id);
              没有找到,就重新创建
          if (!stream) {
            stream = MediaStreamProxy::Create(rtc::Thread::Current(),
                                              MediaStream::Create(s
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到使用 WebRTC VAD (Voice Activity Detection) 的代码时,你可以参考以下示例: ```python # 导入所需的库 from webrtcvad import Vad import wave # 创建一个 VAD 实例 vad = Vad() # 设置 VAD 的模式(1,2,3) vad.set_mode(2) # 打开音频文件 audio_file = wave.open('audio.wav', 'rb') # 读取音频文件的参数 sample_width = audio_file.getsampwidth() sample_rate = audio_file.getframerate() # 每次处理的音频帧大小(10 毫秒) frame_size = int(sample_rate / 100) # 用于存储检测到的音频活动段的列表 active_segments = [] # 读取并处理音频文件 while True: # 读取一帧音频数据 frame = audio_file.readframes(frame_size) # 如果没有读取到数据,则结束循环 if not frame: break # 将音频数据传递给 VAD 进行活动检测 is_speech = vad.is_speech(frame, sample_rate) # 如果检测到音频活动,则将活动段添加到列表中 if is_speech: active_segments.append(frame) # 关闭音频文件 audio_file.close() # 输出活动段的数量 print(f"Detected {len(active_segments)} active segments") # 处理检测到的活动段... ``` 上述代码中,我们首先导入了必要的库,包括 `webrtcvad` 和 `wave`。然后,我们创建了一个 VAD 实例,并通过 `set_mode` 方法设置 VAD 的模式(1、2 或 3)。接下来,我们打开待处理的音频文件,并读取其参数(采样宽度和采样率)。 我们使用 `readframes` 方法读取每一帧音频数据,并将其传递给 VAD 的 `is_speech` 方法进行活动检测。如果检测到音频活动,则将该活动段添加到 `active_segments` 列表中。 最后,我们关闭音频文件,并可以进一步处理检测到的音频活动段。 请注意,上述代码仅为示例,你可能需要根据实际情况进行适当修改和调整。另外,在使用之前,请确保已安装 `webrtcvad` 库,可以通过以下命令进行安装: ``` pip install webrtcvad ``` 希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值