WebRTC for Android : VideoRendererGUI 在视频通话中截图

WebRTC for Android : VideoRendererGUI take a screenshot in the video call

需求是在视频通话中保存一个视频帧。我做了一个演示,通过 GLSurfaceView 的方法 "onDrawFrame" 截取屏幕截图。但是当我使用 webrtc 时,它有自己的渲染器 "VideoRendererGUI" 。然后当我想覆盖它时,我发现它无法覆盖。主要部分代码:

   vsv = (GLSurfaceView) findViewById(R.id.glviewchild_call);
    vsv.setPreserveEGLContextOnPause(true);
    vsv.setKeepScreenOn(true);

    VideoRendererGui.setView(vsv, new Runnable() {
        @Override
        public void run() {
            init();
        }
    });

还有如果你有其他的截图方法也可以分享给我哦。 非常感谢!

很抱歉,由于 canvas 和 Android 中的其他设施不可用,无法使用 WebRTC 以编程方式捕获屏幕截图。可以通过为应用程序设置动画 UI 并手动捕获屏幕截图,将其存储在配置的位置并与其他方交换来避免这种情况。

如果您使用 SurfaceViewRenderer 显示流,您可以使用 this answer 中的解决方案来捕获调用中的帧。

基本上,使用 surfaceViewRenderer.AddFrameListener 和实现 EGLRenderer.FrameListener

的 class

我将假定您要为其截屏的对等点的 SurfaceViewRenderer 称为 remotePeerSurfaceViewRenderer,我还将假定您将用于截屏的按钮被称为btnScreenshot

所以你需要做的就是如"Webo80"在上面的答案中所说的那样使用FrameListener,问题是一旦Listener附加到SurfaceViewRenderer,所以我的方法是在第二个附加 FrameListsner 的 webrtc 实现,我需要截图并在截图后将其删除:

btnScreenshot.setOnClickListener((view)-> {
    remotePeerSurfaceViewRenderer.addFrameListsner(new EglRenderer.FrameListener() {
            @Override
            public void onFrame(Bitmap bitmap) {
                runOnUiThread(() -> {
                    /*
                    do what ever you want with the bitmap for example
                    imgView.setImageBitmap(bitmap);
                    */
                    localVideoView.removeFrameListener(this);
                });
            }
        }, 1);
})

重要提示:

1. Please don't forget to runOnUiThread as Iam doing
2. Please don't forget to remove the listener inside the button onClick() method

我已经尝试过这个解决方案并且它工作得很好,如果你想制作你的自定义解决方案你必须完全实现接口 "EglRenderer.FrameListener"