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

时间:2017-07-13 04:16:56

标签: android webrtc screenshot

需求是在视频通话中保存视频帧。我制作了一个演示,通过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();
        }
    });

如果您有其他方式截取屏幕截图,您也可以与我分享。 非常感谢!

3 个答案:

答案 0 :(得分:1)

我将要捕获其屏幕快照的对等方的SurfaceViewRenderer称为 remotePeerSurfaceViewRenderer ,我还将假设用于捕获屏幕快照的按钮称为 btnScreenshot

因此,您需要做的就是上面答案中的“ Webo80”所说的使用FrameListener,问题是,一旦将Listener附加到SurfaceViewRenderer上,webrtc的FrameListener实现仅获取第一个可用的帧。做到这一点的方法是在第二次附加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”

答案 1 :(得分:0)

我很遗憾地说,由于Android中没有画布和其他设施,因此无法使用WebRTC以编程方式捕获屏幕截图。可以通过动画应用程序的UI并手动捕获屏幕截图,将其存储在配置的位置并与其他方交换来躲避这种情况。

答案 2 :(得分:0)

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

基本上,将surfaceViewRenderer.AddFrameListener与实现EGLRenderer.FrameListener的类一起使用