我正在尝试在 Android(移动)应用程序上使用 WebRTC 制作一个简单的功能。 该应用程序现在可以进行简单的视频通话:将两个设备相互连接并让它们听到和看到。 我想要实现的是在通话期间进行一些现场绘图。简而言之:用户 1 调用用户 2,调用接通,然后用户 1 单击将卡住视频帧的绘制按钮并允许他在此卡住的帧上绘制。显然,用户 2 应该在他的手机上实时看到这幅画。 现在我可以卡住帧(通过调用 videoCapture.stopCapture())并使用自定义 SurfaceViewRenderer 在其上绘制。问题是 User2 看不到绘图,只能看到卡住的帧。
首先,我尝试创建一个新的视频轨道,其中包含绘图 Canvas 和用于绘制的卡住帧,但我没有成功。
使用 peerConnectionFactory.createVideoTrack("ARDAMSv1_"+ rand, videoSource);
创建视频轨道时
我应该指定轨道的视频源,但源只能是 VideoSource
并且此 VideoSource 只能使用直接链接到设备的 VideoCapturer
创建相机(当然没有任何绘图)。这就解释了为什么用户 2 在他的设备上看不到任何绘图。
我的问题是:如何创建一个 VideoCapturer,它可以流式传输相机流(卡住帧)和带有绘图的 Canvas ?
所以我尝试将自己的 VideoCapturer 实现为:
1) 捕获一个 View (例如包含绘图和卡住帧的布局)并将其流式传输到 VideoSource
或者 2) 捕获相机 View ,但在流式传输之前将绘图添加到帧中。
我无法完成这些工作,因为我不知道如何操作 I420Frame 对象以在其上绘制并通过正确的回调返回它。
也许我对这种方法完全错误,需要做一些完全不同的事情,我愿意接受任何建议。 PS:我正在使用 Android API 25 和 WebRTC 1.0.19742。我不想使用任何付费的第三方 SDK/lib。
有谁知道如何继续实现从一个 Android 应用程序到另一个 Android 应用程序的简单 WebRTC 实时绘图?
最佳答案
几周前我们又回到了那个功能,我设法找到了一个方法。
我扩展了我自己的 CameraCapturer 类,以便在渲染之前控制相机帧。然后我创建了自己的 CanvasView 以便能够在上面绘图。
从那里我所做的是将两个位图合并在一起(相机 View + 我的 Canvas 和绘图),然后我在缓冲区上用 OpenGL 绘制它并将它显示在 SurfaceView 上。
如果有人感兴趣,我可以发布一些代码。
关于Android - WebRTC : Video call live drawing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49895547/