webrtc native api的几个要点

文章目录

      • 基本流程
      • 状态回调类
      • sdp的中媒体行
      • pc对象

基本流程

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. 如果是本地为发起端则需调用PeerConnectionCreateOffer方法,产生本地sdp信息(抽象为了webrtc::SessionDescriptionInterface**对象),触发 **CreateSessionDescriptionObserver**中 **OnSuccess方法,在OnSuccess方法中调用PeerConnectionSetLocalDescription方法,获取sdp字符串后通过信令协议给到远端。
  6. 如果远端是发起,在收到信令服务传来的远端sdp消息,调用PeerConnectionSetRemoteDescription方法(需将sdp字符转换为webrtc::SessionDescriptionInterface对象)。然后调用PeerConnectionCreateAnswer方法(产生的local sdp应该还是会通过CreateSessionDescriptionObserverOnSuccess回调给出,最终还是通过PeerConnectionSetLocalDescription方法设置,需要调试一下,追踪流程)。

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

状态回调类

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

sdp回调接口与pc回调接口.jpg
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行。

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。

//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就是直接管理编解码器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/375981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测&#xff08;完整源码…

光伏板安装角度有什么讲究?

随着太阳能技术的日益普及&#xff0c;光伏板&#xff08;也称为太阳能电池板&#xff09;已成为我们日常生活中不可或缺的一部分。在安装光伏板时&#xff0c;选择合适的安装角度是一个至关重要的环节&#xff0c;它直接影响到光伏系统的效率和发电量。本文将探讨光伏板安装角…

RabiitMQ延迟队列(死信交换机)

Dead Letter Exchange&#xff08;死信交换机&#xff09; 在MQ中&#xff0c;当消息成为死信&#xff08;Dead message 死掉的信息&#xff09;后&#xff0c;消息中间件可以将其从当前队列发送到另一个队列中&#xff0c;这个队列就是死信队列。而 在RabbitMQ中&#xff0c;由…

Android14音频进阶:MediaPlayerService如何启动AudioTrack 上篇(五十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

正确入市时机3秒抓住,WeTrade众汇无偿实例分享

在上篇文章中&#xff0c;WeTrade众汇无偿分享如何3秒抓住正确入市的时机&#xff0c;今天让我们通过一个例子来验证这个策略的正确性。 对于突破策略&#xff0c;WeTrade众汇用了同样的图表来演示挤压交易。蓝色箭头表示变窄的区域&#xff0c;红色箭头表示烛台穿过下层。当它…

成功解决RuntimeError: batch2 must be a 3D tensor

成功解决RuntimeError: batch2 must be a 3D tensor。 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;问题初探&#xff1a;为什么会出现这个错误&#xff1f;&#x1f333;&#x1f333;解决方案&#xff1a;如何避免和修复这个错误&#x…

啤酒:探索精酿啤酒与川菜的麻辣味觉之旅

在中国的饮食文化中&#xff0c;川菜以其麻辣味道而闻名于世。当Fendi Club啤酒遇上川菜&#xff0c;会碰撞出怎样的味觉火花&#xff1f;今天&#xff0c;让我们一起踏上这场探索Fendi Club啤酒与川菜麻辣味觉之旅。 首先&#xff0c;让我们来了解一下Fendi Club啤酒。这款啤酒…

mfc110.dll是什么?解决mfc110.dll丢失windows系统常见问题

今天我在打开电脑软件时候&#xff0c;突然报错出现找不到mfc110.dll丢失&#xff0c;无法打开软件&#xff0c;我不知道是什么原因&#xff0c;后面找了很久才找到解决方法&#xff0c;那么mfc110.dll是什么&#xff1f;为什么会丢失和mfc110.dll解决方法是什么&#xff0c;今…

年货大数据(年货节数据/电商行业数据):龙年再添两个黑马食品饮料品类,增长11倍!

年货零食三大件&#xff1a;牛奶、糖果和炒货。今年再多两大件&#xff0c;礼品卡券和腊味。 根据鲸参谋数据显示&#xff0c;今年坚果炒货、糖果、牛奶乳品、饮料等品类依然是长期的年货热门品类。1月前三周&#xff0c;牛奶乳品销量环比增长68%&#xff0c;销售额环比增长55…

ThreadLocal及阿里(TransmittableThreadLocal,TTL)分析

TTL类关系图 ThreadLocal <- InheritableThreadLocal <- TransmittableThreadLocal 1. ThreadLocal ThreadLocal 类提供线程本地&#xff08;局部&#xff09;变量。每个线程都有自己独立初始化的变量副本。 TheadLocal 允许我们存储仅由特定线程访问的数据&#xff0c;…

C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法

目录 一、使用的方法 1.使用Array.Copy方法 2.Copy(Array, Int32, Array, Int32, Int32) 3. 使用自定义的方法 二、实例 1.示例1&#xff1a;使用Array.Copy方法 2.示例2&#xff1a;使用自定义的方法 一、使用的方法 1.使用Array.Copy方法 首先定义了一个名为InsertAr…

可解释性AI(XAI):开启AI决策过程透明化,重塑信任与解决伦理偏见

文章目录 每日一句正能量前言可解释性AI的定义与重要性什么是可解释性&#xff1f;促进技术应用的可信度提高技术的透明度保护隐私和数据权益促进AI的社会接受度 可解释性AI的挑战与难点可解释性AI的应用场景后记 每日一句正能量 宁可因高目标而脖子硬&#xff0c;也不要为低目…

Java+SpringBoot:构建稳定高效的计算机基础教学平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

《Java程序设计》实验报告(四)之数据库操作

实验内容及步骤&#xff1a; 数据库的建立、删除等。&#xff08;1&#xff09;代码&#xff1a; package liyuxuan.study.java; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class CreateD…

npm 上传一个自己的应用(5) 删除自己发送到NPM官网的指定工具版本

上文 npm 上传一个自己的应用(4) 更新自己上传到NPM中的工具版本 并就行内容修改 我们更新了项目内容 然后更新了项目版本 那么 一些已经过时 甚至 当时上传的东西就有问题 我们又该怎么删除版本呢&#xff1f; 首先 我们还是要先登录 npm npm login然后 根据要求填写 Userna…

迅为RK3588开发板windows与开发板互传使用U盘进行拷贝

1 将 U 盘(U 盘的格式必须为 FAT32 格式&#xff0c;大小在 32G 以下)插到开发板的 usb 接口&#xff0c;串口打印信息如下所示&#xff0c;U 盘的设备节点是/dev/sdb4。U 盘的设备节点不是固定的&#xff0c;根据实际情况来查看设备节点。 2 输入以下命令挂载 U 盘&#xff0c…

新版本nginx安装提示需要openssl的问题

新版本的nginx安装的时候未发现openssl的路径&#xff0c;有两种方式解决 方式一&#xff1a; 找到本地nginx的解压目录中 &#xff0c;例如我的放到root下面了。 进入 /root/nginx1.24.0/auto/lib/openssl/conf 目录下修改内容 &#xff0c;这两行都需要修改&#xff0c;…

华为配置访客接入WLAN网络示例(MAC优先的Portal认证)

配置访客接入WLAN网络示例&#xff08;MAC优先的Portal认证&#xff09; 组网图形 图1 配置WLAN MAC优先的Portal认证示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业为了提高WLAN网络的安全性&#xff0c;采用MAC优先的外置Portal认…

【51单片机】外部中断和定时器中断

目录 中断系统中断介绍中断概念 中断结构及相关寄存器中断结构中断相关寄存器 外部中断实验外部中断配置软件设计实验现象 定时器中断定时器介绍51 单片机定时器原理51 单片机定时/计数器结构51 单片机定时/计数器的工作方式 定时器配置硬件设计软件设计实验现象 中断系统 本章…

10个优化Instagram SEO的必学策略

Instagram SEO 是优化 Instagram 内容以使其在平台搜索结果中被发现的做法。如果你希望你可以更快的让你的Ins获得流量&#xff0c;做好SEO就成功了一半。Instagram 搜索结果包括相关内容、帐户、音频、主题标签和地点&#xff0c;下面为你总结10个策略技巧&#xff01; 一、In…