webrtc c++(三) peerConnection分析

本文深入剖析WebRTC的PeerConnection接口,它是音视频交互的核心,负责实时信息的传输与管理。文章探讨了PeerConnection的继承关系、关键成员变量及其作用,如本地与远程流管理、ICE状态与媒体控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

peerconnection是webrtc面向外面的音视频交互的统一接口,可以理解为一个功能特别强大的socket接口,里面保存了实时交互的所有信息,同时音视频的转发与接收也是通过peerconnection来完成

1 peerconnection 概述

peerconnection继承自PeerConnectionInterface 接口,所以作为对外暴露的统一接口为PeerConnectionInterface,通过工厂方法来通过统一创建PeerConnectionInterface 来创建peerconnection,在peerConnection.h中,// It uses WebRtcSession to implement the PeerConnection functionality. 说明了,webRtcSession类的重要

2 peerconnection类简要分析

  rtc::scoped_refptr<PeerConnectionFactory> factory_; //创建工厂
  PeerConnectionObserver* observer_;    //回调观察者,一般在外部类创建成功时,传入this指针,在示例中是Conductor,方便时间回调
  UMAObserver* uma_observer_; //暂时不清楚
  SignalingState signaling_state_; // signal slot相关
  // TODO(bemasc): Remove ice_state_.
  IceState ice_state_;    //ice状态
  IceConnectionState ice_connection_state_;//ice链接状态(相当于ice_state_的子状态的一个状态)
  IceGatheringState ice_gathering_state_;//ice 收集状态(相当于ice_state_的子状态的一个状态)

  std::unique_ptr<cricket::PortAllocator> port_allocator_;//sdp相关?
  std::unique_ptr<MediaControllerInterface> media_controller_;//媒体控制相关

  // One PeerConnection has only one RTCP CNAME.
  // https://tools.ietf.org/html/draft-ietf-rtcweb-rtp-usage-26#section-4.9
  std::string rtcp_cname_;

  // Streams added via AddStream.
  rtc::scoped_refptr<StreamCollection> local_streams_;//本地stream管理
  // Streams created as a result of SetRemoteDescription.
  rtc::scoped_refptr<StreamCollection> remote_streams_;//远端stream管理

  std::vector<std::unique_ptr<MediaStreamObserver>> stream_observers_;

  // These lists store track info seen in local/remote descriptions.
  TrackInfos remote_audio_tracks_;
  TrackInfos remote_video_tracks_;
  TrackInfos local_audio_tracks_;
  TrackInfos local_video_tracks_;

  SctpSidAllocator sid_allocator_;//暂不清楚
  // label -> DataChannel
  std::map<std::string, rtc::scoped_refptr<DataChannel>> rtp_data_channels_;//数据通道
  std::vector<rtc::scoped_refptr<DataChannel>> sctp_data_channels_;
  std::vector<rtc::scoped_refptr<DataChannel>> sctp_data_channels_to_free_;

  bool remote_peer_supports_msid_ = false;

  std::vector<rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>>>
      senders_;
  std::vector<
      rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>>
      receivers_;

  std::unique_ptr<WebRtcSession> session_; //session管理类
  std::unique_ptr<StatsCollector> stats_;

 

WebRTC PeerConnectionWebRTC技术框架中重要的一环,它提供了实时音视频通信的能力。如果你想在你的应用程序中使用PeerConnection,你需要经过以下步骤将它引入进来: 1. 首先,你需要在你的应用程序中引入WebRTC的JavaScript库。你可以通过在你的HTML文件中引入以下代码来实现: ```<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>``` 2. 接下来,你需要在你的应用程序中创建PeerConnection实例。创建实例时,你需要指定ICE服务器的URL。此外,你还可以将本地音视频流添加到PeerConnection中。 ``` var pc = new RTCPeerConnection({ 'iceServers': [{ 'urls': 'stun:stun.l.google.com:19302' }] }); navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(function(stream) { var videoTrack = stream.getVideoTracks()[0]; var audioTrack = stream.getAudioTracks()[0]; pc.addTrack(videoTrack, stream); pc.addTrack(audioTrack, stream); }); ``` 3. 现在,你已经成功地创建了PeerConnection实例,并添加了本地音视频流。下一步是启动ICE候选项协商,以建立远程音视频流。这可以通过创建一个SDP交换会话,以与远程对等方交换SDP来实现。 ``` pc.createOffer().then(function(offer) { return pc.setLocalDescription(offer); }).then(function() { // send offer to remote peer }); ``` 以上就是引入WebRTC PeerConnection的方法。当然,以上代码只是基础代码,并不能实现完整的音视频通信。在实际应用中,还需要处理候选项协商、SDP交换、ICE连接状态等。但不管怎样,PeerConnection作为WebRTC技术的核心,对于实现实时音视频通信至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值