webrtc native api的几个要点

文章目录

基本流程

webrtc native的接口,主要就是围绕着PeerConnection对象,一个PeerConnection对象它代表了一次音视频会话。

那么通过PeerConnection对象建立音视频通话,包括如下步骤:

  1. 创建PeerConnectionFactory,通过工厂方法webrtc::CreatePeerConnectionFactory
  2. 创建PeerConnection,通过它的PeerConnectionFactory的CreatePeerConnection方法。
  3. 调用PeerConnectionFactoryCreateAudioTrackCreateVideoTrack方法创建Track。
  4. 调用PeerConncetionAddTrack方法添加Track,track最终会反映到sdp中的m行中。协商成功的Track在随后会通过 onAddTrack回调告知应用层,根据Track的类型来确定是回放视频还是音频。
  5. 如果是本地为发起端则需调用 PeerConnection CreateOffer方法,产生本地sdp信息(抽象为了 webrtc::SessionDescriptionInterface**对象),触发 **CreateSessionDescriptionObserver**中 **OnSuccess方法,在 OnSuccess方法中调用 PeerConnection SetLocalDescription方法,获取sdp字符串后通过信令协议给到远端。
  6. 如果远端是发起,在收到信令服务传来的远端sdp消息,调用PeerConnectionSetRemoteDescription方法(需将sdp字符转换为webrtc::SessionDescriptionInterface对象)。然后调用PeerConnectionCreateAnswer方法(产生的local sdp应该还是会通过CreateSessionDescriptionObserverOnSuccess回调给出,最终还是通过PeerConnectionSetLocalDescription方法设置,需要调试一下,追踪流程)。

整个过程本质就是获取本地sdp信息和远端sdp信息,再进行协商,流程可以概括为如下图。

状态回调类

上述流程都是异步,所以会有状态回调来告知应用状态。主要的两个Observer就是CreateSessionDescriptionObserverPeerConnectionObserver,前者是告知sdp创建,协商的状态。后者是PC对象的状态。如下图。


Conductor类在examples/peerconnection/client/conductor.h,是webrtc native的pc对象封装示例代码。

实现一个pc client,可以参照它的实现,首先是要继承CreateSessionDescriptionObserverPeerConnectionObserver,再是有PeerConnectionInterface(PC对象)和PeerConnectionFactoryInterface(用于创建PC对象)的成员变量。

sdp的中媒体行

sdp中核心的信息就是描述媒体信息的内容,简称m行或媒体行。通过pc对象的AddTrack或AddTransceiver方法添加track,会直接反映到sdp中。

如下代码,添加了两个VideoTrack,最终反映到sdp中为两个sendrecv的m行。

cpp 复制代码
rtc::scoped_refptr<CapturerTrackSource> video_device =
      CapturerTrackSource::Create();
  if (video_device) {
    rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track_(
        peer_connection_factory_->CreateVideoTrack(kVideoLabel, video_device));
    main_wnd_->StartLocalRenderer(video_track_);

    result_or_error = peer_connection_->AddTrack(video_track_, {kStreamId});
    if (!result_or_error.ok()) {
      RTC_LOG(LS_ERROR) << "Failed to add video track to PeerConnection: "
                        << result_or_error.error().message();
    }

    //添加第二个video track
    rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track_1(
        peer_connection_factory_->CreateVideoTrack("video_track_1", video_device));

    result_or_error = peer_connection_->AddTrack(video_track_1, {kStreamId});
    if (!result_or_error.ok()) {
      RTC_LOG(LS_ERROR) << "Failed to add video track to PeerConnection: "
                        << result_or_error.error().message();
    }

  } else {
    RTC_LOG(LS_ERROR) << "OpenVideoCaptureDevice failed";
  }

如下代码添加了一个VieoTrack,方向为recvonly。

cpp 复制代码
//video recvonly
webrtc::RtpTransceiverInit init;
init.direction = webrtc::RtpTransceiverDirection::kRecvOnly;
  
peer_connection_->AddTransceiver(cricket::MediaType::MEDIA_TYPE_VIDEO, init);

pc对象

一个PC对象表示一次P2P会话,它包括sdp handle,call。可以产生多个PC对象,PC对象之间相互不关联。

std::unique_ptr<SdpOfferAnswerHandler> sdp_handler_;用以处理sdp协商。
std::unique_ptr<Call> call_;管理PC sdp中对应的stream,如下类图为它提供的核心方法:

一个PC对象中video/audio send/receive stream都被webrtc::interal::call对象管理,也是通过它的接口进行创建。

sdp中一个m行对应一个RtpTransceiver对象,最终被映射成MediaChannel和 video/audio的各种send/receive stream(比如webrtc::internal::VideoSendStream),而这些stream就是直接管理编解码器。

相关推荐
RTC老炮3 天前
webrtc弱网-AlrDetector类源码分析与算法原理
服务器·网络·算法·php·webrtc
不会吃萝卜的兔子4 天前
go webrtc - 2 webrtc重要概念
webrtc
ayaya_mana4 天前
BilldDesk:基于Vue3+WebRTC+Nodejs+Electron的开源远程桌面控制
electron·开源·webrtc
她超甜i5 天前
前端通过后端给的webrtc的链接,在前端展示,并更新实时状态
前端·javascript·webrtc
计算机小手6 天前
高效 P2P 文件传输工具:FileSync 利用 WebRTC 技术实现极速安全传输
经验分享·docker·webrtc·开源软件
AI码上来7 天前
当小智 AI 遇上数字人,我用 WebRTC 打造实时音视频应用
人工智能·webrtc·实时音视频
Antonio9157 天前
【音视频】WebRTC 音视频延时、同步分析以及超低延时优化
音视频·webrtc
RTC老炮8 天前
webrtc弱网-LossBasedBandwidthEstimation类源码分析与算法原理
网络·算法·webrtc
小噔小咚什么东东8 天前
看到了很多次WebRTC,但是你真的需要它吗?
前端·webrtc
Antonio9158 天前
【音视频】WebRTC P2P、SFU 和 MCU 架构
音视频·webrtc·p2p