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"
需求是在视频通话中保存一个视频帧。我做了一个演示,通过 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
我将假定您要为其截屏的对等点的 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"