人事代理网站建设,网站设计的要素,鞍山一地发布最新通知,开发软件网站多少钱文章目录 前言PeerConnectionFactoryPeerConnection 前言
最近在学习WebRTC的时候#xff0c;发现只有JavaScript的API文档#xff0c;找了很久没有找到Android相关的API文档#xff0c;所以通过此片文章记录下在Android应用层如何使用WebRTC
本篇文章结合#xff1a;【W… 文章目录 前言PeerConnectionFactoryPeerConnection 前言
最近在学习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)
)