Android WebRTC 中的本地视频渲染器
Local Video Renderer in Android WebRTC
我正在使用这个库:https://bintray.com/google/webrtc/google-webrtc
我想要实现的(至少,在我的项目开始时)是在本地渲染视频。我正在使用本教程(这是 Internet 上唯一的教程)https://vivekc.xyz/getting-started-with-webrtc-for-android-daab1e268ff4。不幸的是,最后一行代码不再是最新的了。构造函数需要一个我不知道如何实现的回调:
localVideoTrack.addRenderer(new VideoRenderer(i420Frame -> {
// no idea what to put here
}));
我的代码与发布的教程中的代码完全相同。这是我在Android中熟悉WebRTC技术的第一步,我想不通。我的相机正在拍摄视频,因为我可以在我的日志中看到它:
I/org.webrtc.Logging: CameraStatistics: Camera fps: 28.
主要问题是我不知道如何通过回调将它传递给我的 SurfaceViewRenderer
。有人遇到过这个问题吗?非常感谢任何帮助或建议。
这是官方示例应用程序,它是唯一的来源,但它与教程中的应用程序不同,它要复杂得多:
https://webrtc.googlesource.com/src/+/master/examples/androidapp/src/org/appspot/apprtc
你是对的,API 不再与教程中的匹配,但很接近。
VideoTrack 有一个 addRenderer(VideoRenderer renderer)
方法,需要您创建一个 VideoRenderer,并将 SurfaceViewRenderer 作为参数。但这不再可能了,因此您应该使用 VideoTrack 的 addSink(VideoSink sink)
方法。 SurfaceViewRenderer 对象实现 VideoSink onFrame(VideoFrame frame)
方法来完成这项工作。
VideoTrack videoTrack = utility.createVideoTrack();
videoTrack.addSink(this.localSurfaceViewRenderer);
我使用了相同的官方示例应用程序作为参考来得出这个结论,它对我来说效果很好。
private static class ProxyVideoSink implements VideoSink {
private VideoSink target;
@Override
synchronized public void onFrame(VideoFrame frame) {
if (target == null) {
Logging.d("TAG", "Dropping frame in proxy because target is null.");
return;
}
target.onFrame(frame);
}
synchronized public void setTarget(VideoSink target) {
this.target = target;
}
}
ProxyVideoSink localVideoSink = new ProxyVideoSink();
videoTrack.addSink(localVideoSink);
localVideoSink.setTarget(localSurfaceView);
尝试此代码,因为直接分配 videoTrack.addSink(localSurfaceView)
可能会在下次初始化时崩溃。
我正在使用这个库:https://bintray.com/google/webrtc/google-webrtc
我想要实现的(至少,在我的项目开始时)是在本地渲染视频。我正在使用本教程(这是 Internet 上唯一的教程)https://vivekc.xyz/getting-started-with-webrtc-for-android-daab1e268ff4。不幸的是,最后一行代码不再是最新的了。构造函数需要一个我不知道如何实现的回调:
localVideoTrack.addRenderer(new VideoRenderer(i420Frame -> {
// no idea what to put here
}));
我的代码与发布的教程中的代码完全相同。这是我在Android中熟悉WebRTC技术的第一步,我想不通。我的相机正在拍摄视频,因为我可以在我的日志中看到它:
I/org.webrtc.Logging: CameraStatistics: Camera fps: 28.
主要问题是我不知道如何通过回调将它传递给我的 SurfaceViewRenderer
。有人遇到过这个问题吗?非常感谢任何帮助或建议。
这是官方示例应用程序,它是唯一的来源,但它与教程中的应用程序不同,它要复杂得多: https://webrtc.googlesource.com/src/+/master/examples/androidapp/src/org/appspot/apprtc
你是对的,API 不再与教程中的匹配,但很接近。
VideoTrack 有一个 addRenderer(VideoRenderer renderer)
方法,需要您创建一个 VideoRenderer,并将 SurfaceViewRenderer 作为参数。但这不再可能了,因此您应该使用 VideoTrack 的 addSink(VideoSink sink)
方法。 SurfaceViewRenderer 对象实现 VideoSink onFrame(VideoFrame frame)
方法来完成这项工作。
VideoTrack videoTrack = utility.createVideoTrack();
videoTrack.addSink(this.localSurfaceViewRenderer);
我使用了相同的官方示例应用程序作为参考来得出这个结论,它对我来说效果很好。
private static class ProxyVideoSink implements VideoSink {
private VideoSink target;
@Override
synchronized public void onFrame(VideoFrame frame) {
if (target == null) {
Logging.d("TAG", "Dropping frame in proxy because target is null.");
return;
}
target.onFrame(frame);
}
synchronized public void setTarget(VideoSink target) {
this.target = target;
}
}
ProxyVideoSink localVideoSink = new ProxyVideoSink();
videoTrack.addSink(localVideoSink);
localVideoSink.setTarget(localSurfaceView);
尝试此代码,因为直接分配 videoTrack.addSink(localSurfaceView)
可能会在下次初始化时崩溃。