Openvidu Server 的WebRTC通讯实现 I
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Openvidu Server 的WebRTC通讯实现 I相关的知识,希望对你有一定的参考价值。
参考技术A Kurento 是一个不错的基于webRTC的音视频媒体服务器。 Openvidu在kurento的基础上实现了音视频会议的功能。我们部署了Openvidu的社区版,在单机上实现了webRTC音视频会议的搭建。为了更进一步了解openvidu,我们有必要花些时间看看openvidu做了什么和怎么实现webRTC通信的。有了ICE的帮助, 浏览器可以知道自己的外网IP和映射端口等信息,但是在建立webRTC连接前,仍需要互相交换各自的信息, 这个过程并没有在WebRTC框架里定义,所以需要自己来实现。webrtc规范制定组认为,信息的交换应该支持任意方式。这些需要交换的信息被称为signal,而实现signal交换就要借助signaling server. 下面是一个更全的webRTC通信模型。
-- PeerB 想和PeerA通信, 首先他需要告诉B,我想和你通信,所以PeerA 通过signal Server 发送给PeerB 一条自己要建立连接的音视频媒体信息(称为offer,包含webrtc建立需要的信息,但并不包含IP和端口等连接信息).
Notes:这里的offer只包含媒体信息,不包含通信连接信息(IP, 端口等)
-- peer B 收到A 的offer后,保存在本地,并生成自己的offfer返回给A(成为answer offer).
-- PeeA 与PeerB 告诉浏览器开始连接, 浏览器通过ICE框架,不断的发送给可能建立连接的IP和端口。他们封装为candidate,通过 Signal Server发送给彼此。
--- 收到对方的candidate后,PeerA ,peer B开始尝试建立连接。
---双方最终完成连接的建立,开始音视频通信。
上面就是一个基本的WebRTC的通信模型。可以看到需要通信,需要STUN Server, TURN Server, 还有signal server.
Android无法在通信过程中从相机切换到屏幕共享webrtc
【中文标题】Android无法在通信过程中从相机切换到屏幕共享webrtc【英文标题】:Android unable to switch from camera to screen sharing webrtc in middle of communication 【发布时间】:2020-11-25 04:38:08 【问题描述】:我正在开发 android 应用程序并将 webrtc 与 openvidu 一起使用。我得到了屏幕共享和相机共享工作。但只有其中任何一种适用于一个对等连接。我无法在它们之间切换。默认情况下,当建立连接时,相机将被共享,单击按钮我应该能够在不断开现有连接的情况下共享屏幕。但是,在我的情况下并没有发生这种情况。它不会在单击按钮时发布屏幕。一片空白。
如果有人在相机和共享屏幕之间切换,反之亦然,请帮助我。 提前致谢。
public VideoTrack MakeCameraSettingsReady()
final EglBase.Context eglBaseContext = EglBase.create().getEglBaseContext();
PeerConnectionFactory peerConnectionFactory = this.sessionManager.getPeerConnectionFactory();
// create AudioSource
AudioSource audioSource = peerConnectionFactory.createAudioSource(new MediaConstraints());
this.audioTrack = peerConnectionFactory.createAudioTrack("101", audioSource);
surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext);
// create VideoCapturer
videoCapturer = createVideoCapturer();
//MediaConstraints constraints = new MediaConstraints();
VideoSource videoSource = peerConnectionFactory.createVideoSource(videoCapturer.isScreencast());
localVideoTrack = peerConnectionFactory.createVideoTrack("100", videoSource);
videoCapturer.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
videoCapturer.startCapture(720, 1280, 30);
return localVideoTrack;
public VideoTrack MakeScreenCaptureReady()
final EglBase.Context eglBaseContext = EglBase.create().getEglBaseContext();
PeerConnectionFactory peerConnectionFactory = this.sessionManager.getPeerConnectionFactory();
// create AudioSource
AudioSource audioSource = peerConnectionFactory.createAudioSource(new MediaConstraints());
this.audioTrack = peerConnectionFactory.createAudioTrack("101", audioSource);
surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext);
// create VideoCapturer
screenCapturerAndroid = (ScreenCapturerAndroid) createScreenCapturer();
//MediaConstraints constraints = new MediaConstraints();
VideoSource videoSource = peerConnectionFactory.createVideoSource(screenCapturerAndroid.isScreencast());
localVideoTrack = peerConnectionFactory.createVideoTrack("100", videoSource);
screenCapturerAndroid.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
screenCapturerAndroid.startCapture(720, 1280, 30);
return localVideoTrack;
当我点击按钮分享屏幕时,我使用以下代码:
private fun stopCameraShare()
videoCapturerAndroid?.stopCapture()
localRenderer.dispose()
localVideoView.release()
localVideoView.clearImage()
stream?.removeTrack(localVideoTrack)
localVideoTrack.dispose()
private fun shareScreen()
stopCameraShare()
val mediaProjectionManager = activity!!.getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 29)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == SCREEN_RECORD_REQUEST_CODE)
if (resultCode == RESULT_OK)
//Start screen recording
mResultCode = resultCode
mResultData = data
runOnUiThread
screenCaptureVideoTrack = mLiveSessionViewModel!!.localParticipant?.MakeScreenCaptureReady()
mLiveSessionViewModel!!.localParticipant?.screenCaptureVideoTrack = screenCaptureVideoTrack
我尝试过的参考资料: How to share screen remotely in a video/audio call?
https://github.com/Jeffiano/ScreenShareRTC
https://chromium.googlesource.com/external/webrtc/+/b75f2541c942e2f35c3b7d7003ed17504176ced1/webrtc/api/android/java/src/org/webrtc/ScreenCapturerAndroid.java
WebRTC - change video stream in the middle of communication
最终,我试图找到一种可以在通信过程中添加跟踪/删除跟踪的方法。谢谢!
【问题讨论】:
【参考方案1】:我认为您正在使用两个视频轨道。 您为什么不尝试只使用一个视频轨道。 像相机共享一样,将视频轨道分配为 mLiveSessionViewModel!!.localParticipant?.mediaStream.videotraks[0] = cameraVideoTrack 切换到屏幕共享,删除现有视频轨道并添加相应的视频轨道 mLiveSessionViewModel!!.localParticipant?.mediaStream.videotrakcs[0].removeTrack(cameraVideoTrack) mLiveSessionViewModel!!.localParticipant?.mediaStream.videotracks[0].addTrack(screenShareVideoTrack)
【讨论】:
以上是关于Openvidu Server 的WebRTC通讯实现 I的主要内容,如果未能解决你的问题,请参考以下文章
无法使用烧瓶从 openvidu-server 获取令牌,出现 SSLError
webrtcclient与TURN和信令server通讯流程图
Android无法在通信过程中从相机切换到屏幕共享webrtc