需求是在视频通话中保存视频帧。我制作了一个演示,通过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();
}
});
如果您有其他方式截取屏幕截图,您也可以与我分享。 非常感谢!
答案 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
的类一起使用