Android WebRTC中的本地视频渲染器

时间:2018-05-11 11:36:09

标签: android video-streaming webrtc

我正在使用此库:https://bintray.com/google/webrtc/google-webrtc

我想要实现的目标(至少在我的项目开始时)是本地渲染视频。我正在使用本教程(这是互联网上唯一的一个)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

2 个答案:

答案 0 :(得分:8)

你是对的,API不再与教程中的API相匹配,但它已经接近了。

VideoTrack有一个addRenderer(VideoRenderer renderer)方法,要求您创建一个VideoRenderer,并将SurfaceViewRenderer作为参数。但这是不可能的,所以你应该使用VideoTrack的addSink(VideoSink sink)方法。 SurfaceViewRenderer对象实现VideoSink onFrame(VideoFrame frame)方法以使其工作。

VideoTrack videoTrack = utility.createVideoTrack();
videoTrack.addSink(this.localSurfaceViewRenderer);

我使用相同的官方示例应用程序作为参考来得出这个结论,它对我来说很好。

答案 1 :(得分:0)

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)可能在下次初始化时崩溃。