【WebRTC】Android SDK使用教学

文章目录

  • 前言
  • PeerConnectionFactory
  • PeerConnection

前言

最近在学习WebRTC的时候,发现只有JavaScript的API文档,找了很久没有找到Android相关的API文档,所以通过此片文章记录下在Android应用层如何使用WebRTC

本篇文章结合:【WebRTC】适合新手宝宝的WebRTC入门教学一起食用更佳

PeerConnectionFactory

负责管理和创建WebRTC所需组件,例如:音视频轨道、PeerConnection,是WebRTC使用的起点

// 1. 初始化Factory,此步骤用于初始化日志、加载JniLib、对Jni进行初始化
PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(WebRtcApp.instance).createInitializationOptions()// 2. 创建factory实例,通过builder可以设置编解码器工厂、AudioDeviceModule(音频设备管理模块)
peerConnectionFactory = PeerConnectionFactory.builder().setOptions(PeerConnectionFactory.Options()).setAudioDeviceModule(audioDeviceModule).setVideoDecoderFactory(defaultDecoder).setVideoEncoderFactory(defaultEncoder).createPeerConnectionFactory()// 3. 创建peerConnection、音视频轨道等
localPeerClient = peerConnectionFactory.createPeerConnection()
videoSource = peerConnectionFactory.createVideoSource(false)
localVideoTrack = peerConnectionFactory.createVideoTrack(WebRtcConstant.VideoTrackID, videoSource)

PeerConnection

这是WebRTC API中最重要的类,负责点对点连接的建立,音视频推流等

1. PeerConnection.RTCConfiguration

WebRTC连接参数,必须通过ICE服务器(PeerConnection.IceServer)列表进行构建

val rtcConfig = PeerConnection.RTCConfiguration(peerIceServers)
rtcConfig.apply {bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLEsdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLANcontinualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLYkeyType = PeerConnection.KeyType.ECDSArtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIREtcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.ENABLEDsuspendBelowMinBitrate = true
}

2. 交换SDP

PeerConnection提供了SDP Offer的创建和发送相关方法

// 1. 创建offer
localPeerClient.createOffer(object : KinesisVideoSdpObserver() {override fun onCreateSuccess(sessionDescription: SessionDescription) {// 1.1 创建offer成功回调super.onCreateSuccess(sessionDescription)// 2. 创建成功后需要将offer设置为LocalDescriptionlocalPeerClient.setLocalDescription(KinesisVideoSdpObserver(), sessionDescription)// 3. 此时应该通过信令服务器将offer发送给远端}}, AwsEngine.getSdpMediaConstraints())// 4. 当收到远端响应的answer时,设置为RemoteDescription
localPeerClient.setRemoteDescription(KinesisVideoSdpObserver(), sdpAnswer)// 5. 当收到远端的offer时,此时先设置RemoteDescription然后需要响应answer
localPeerClient.createAnswer(object : KinesisVideoSdpObserver() {override fun onCreateSuccess(sessionDescription: SessionDescription) {// 5.1 创建answer成功super.onCreateSuccess(sessionDescription)// 5.2 设置为LocalDescriptionit.setLocalDescription(KinesisVideoSdpObserver(), sessionDescription)// 5.3 通过信令服务器发送回远端}}, MediaConstraints())
}

3. 设置ICE候选地址对

ICE候选地址对的来源有两个,一个是由localPeerClient在创建后根据PeerConnection.IceServer返回的,这些地址需要同发送给远端。另一个来源是远端设备,远端设备在与ICE通信后会得到它的候选地址对,此时远端会通过信令服务器通知本设备。

peerConnectionFactory.createPeerConnection(rtcConfig,object : KinesisVideoPeerConnection() {override fun onIceCandidate(iceCandidate: IceCandidate) {// 1. 由WebRTC自动探测出的候选地址对回调super.onIceCandidate(iceCandidate)// 1.1 通过信令服务器告诉远端signalingClient?.sendIceCandidate(message)}}
)// 2. 来自信令服务器的回调
override fun onReceiverIceCandidate(event: Event) {// 2.1 收到远端的候选地址对后,添加到本地的WebRTC中,等待WebRTC自行尝试连接val iceCandidate = Event.parseIceCandidate(event)PeerConnection.addIceCandidate(iceCandidate)
}

4. 添加本地音视频轨道

在WebRTC建立连接后,此时远端的数据会通过回调传来,如果本机需要向远端推流,此时只需要设置音视频轨道即可

// 1. 创建一个空流,需要手动为期添加音轨和视频轨
stream = peerConnectionFactory.createLocalMediaStream(WebRtcConstant.LOCAL_MEDIA_STREAM_LABEL)// 2. 创建视频源,默认创建的源是没有数据的,通常要与摄像头、或自定义数据源进行绑定
videoSource = peerConnectionFactory.createVideoSource(false)// 3. 创建视频轨道,可以绑定到 UI 组件(如本地预览)或添加到 PeerConnection。
//    例如将视频轨道绑定到本地预览视图:localVideoTrack.addSink(localVideoView)
localVideoTrack = peerConnectionFactory.createVideoTrack(WebRtcConstant.VideoTrackID, videoSource)// 4. 向流添加视频轨
stream.addTrack(localVideoTrack)
// 5. 将视频流交至WebRTC处理
localPeerClient?.addTrack(stream!!.videoTracks[0], listOf(stream!!.id))

ps:为什么要设计将数据源和数据轨道分开来

  • 解藕数据源和传输的逻辑,数据源负责数据的采集和生成,数据轨道负责数据的传输
  • 可实现多个数据轨道共享同一个数据源,避免重复采集

5. 开启数据通道

WebRTC不仅提供数据流的传输,还能提供数据报文传输,只需要打开数据通道

// 1. 创建数据通道
localDataChannel = localPeerClient?.createDataChannel("data-channel-of-${connectParameter?.clientId}", DataChannel.Init())
// 2. 注册消息监听
localDataChannel?.registerObserver(object :DataChannel.Observer{override fun onBufferedAmountChange(previousAmount: Long) {}override fun onStateChange() {}override fun onMessage(buffer: DataChannel.Buffer) {// 2.1 远端消息到来时回调val byteArray = ByteArray(buffer.data.remaining())buffer.data.get(byteArray)val messageStr = String(byteArray, Charsets.UTF_8)}
})
// 3. 向远端发送消息
localDataChannel?.send(DataChannel.Buffer(ByteBuffer.wrap(content.toByteArray(Charset.defaultCharset())),false)
)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[小白系列]Ubuntu安装教程-安装prometheus和Grafana

Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。(/data/prometheus/可根据自己需要调整) global:scrape_interval: 15s # By default, scrape targets ev…

oracle之用户的相关操作

(1)创建用户(sys用户下操作) 简单创建用户如下: CREATE USER username IDENTIFIED BY password; 如果需要自定义更多的信息,如用户使用的表空间等,可以使用如下: CREATE USER mall IDENTIFIED BY 12345…

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1

文章目录 Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…

flinkSql 将流和表的互相转换

流——>表 方式一 方式二 方式一&#xff1a;写sql DataStreamSource<String> source env.socketTextStream("localhost", 8881); // 表名&#xff0c;流&#xff0c;字段名称 tableEnv.createTemporaryView("t_1",source&#xff0c;$("…

AI大模型驱动数据分析:利用自然语言实现数据查询与可视化(1)

在当今AI驱动的时代&#xff0c;数据分析已成为各行各业不可或缺的能力。然而&#xff0c;传统的数据分析流程通常需要掌握SQL、数据处理和可视化等多项专业技能&#xff0c;这对非技术背景的业务人员来说是一个不小的挑战。 想象一下&#xff0c;当数据中心的负责人打开手机时…

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…

Qt 安装Qt Serial Port

最近要用Qt写个串口上位机软件&#xff0c;发现Qt的串口库用不了&#xff0c;上网找了一下资料&#xff0c;找到一种解决办法&#xff0c;具体操作如下&#xff1a; 参考文章&#xff1a;https 目录 一、找到QT安装路径&#xff0c;并运行Qt Maintenance Tool二、选择 添加或移…

语音识别flask接口开发

要开发一个flask语音识别接口&#xff0c;首先要解决语音文件在网络中的传输问题&#xff0c;然后选识别算法进行识别 文章目录 1、以二进制文件流方式上次语音2、网页端长连接流式上传语音文件3、语音识别接口 1、以二进制文件流方式上次语音 python服务端代码&#xff0c;以…

计算机毕业设计Python医疗问答系统 医疗可视化 BERT+LSTM+CRF深度学习识别模型 机器学习 深度学习 爬虫 知识图谱 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

shell条件测试

一.命令执行结果判定 && 在命令执行后如果没有任何报错时会执行符号后面的动作 || 在命令执行后如果命令有报错会执行符号后的动作 示例&#xff1a; [rootqingdeng shell3]# sh sl.sh /mnt/file is not exist no二.条件判断方法 在 shell 程序中&#xff0c;用户可…

Couchbase Lite for Android 开源项目 FAQ

Couchbase Lite for Android 开源项目 FAQ couchbase-lite-android couchbase/couchbase-lite-android: Couchbase Lite for Android 是一个轻量级的嵌入式NoSQL数据库引擎&#xff0c;可以在Android设备上离线存储和处理数据&#xff0c;并支持与Couchbase Server进行同步&…

DVWA 靶场 SQL 注入报错 Illegal mix of collations for operation ‘UNION‘ 的解决方案

在 dvwa 靶场进行联合 SQL 注入时&#xff0c;遇到报错 Illegal mix of collations for operation UNION报错如下图&#xff1a; 解决办法&#xff1a; 找到文件MySQL.php 大致位置在dvwaincludesDBMS 目录下 使用编辑器打开 检索$create_db 第一个就是 在{$_DVWA[ ‘db_d…

使用伪装IP地址和MAC地址进行Nmap扫描

使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中&#xff0c;攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描&#xff0c;很可能无法接收到任何响…

PT8M2102 触控型 8Bit MCU

1 产品概述 ● PT8M2102 是一款基于 RISC 内核的8位 MTP 单片机&#xff0c;内部集成了电容式触摸感应模块、TIMER&#xff0c;PWM、LVR、LVD、WDT等外设&#xff0c;其主要用作触摸按键开关&#xff0c;广泛适用于触控调光、电子玩具、消费电子、家用电器等领域&#xff0c;具…

ARM A32多数据处理汇编指令理解分享

ARM A32多数据处理汇编指令理解分享 1 多数据存储指令1.1 push指令1.2 STMFD/STMDB指令1.3 STMED/STMDA指令1.4 STMFA/STMIB指令1.5 STMEA/STMIA指令 2 多数据加载指令2.1 pop指令2.2 LDMFD/LDMIA指令2.3 LDMFA/LDMDA指令2.4 LDMEA/LDMDB指令2.5 LDMED/LDMIB指令 在ARM A32多数…

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…

二分查找(带图详解)

优选算法系列 文章目录 优选算法系列前言一、二分查找的思想二、算法使用小总结 三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结 4.2、target最后出现的位置小总结 五、代码总结 前言 在这篇博客中&#xff0c;我会给大家分享二分查找及其扩展。 这是链接-&…

arguments和纯函数的介绍

认识arguments arguments 是一个 对应于 传递给函数的参数 的类数组(array-like)对象. array-like意味着它不是一个数组类型,而是一个对象类型: □但是它却拥有数组的一些特性,比如说length,比如可以通过index索引来访问;□但是它却没有数组的一些方法,比如forEach、map等; …

煤矿 35kV 变电站 3 套巡检机器人 “上岗”,力破供电瓶颈

近日&#xff0c;杭州旗晟智能科技与甘肃某变电站配电室的三套智能巡检机器人线下测试顺利完成&#xff0c;并成功交付使用&#xff0c;这为电力运维工作注入了全新的活力与强大的技术支撑。 一、项目背景 甘肃某变电站总建筑面积1098平方米的变电站集变电、配电、监控等多功能…