【问题标题】:Local Video Renderer in Android WebRTCAndroid WebRTC 中的本地视频渲染器
【发布时间】:2018-05-11 11:36:08
【问题描述】:

我正在使用这个库: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

【问题讨论】:

标签: android video-streaming webrtc


【解决方案1】:

你是对的,API 不再与教程中的匹配,但很接近。

VideoTrack,有一个addRenderer(VideoRenderer renderer) 方法,需要你创建一个VideoRenderer,以SurfaceViewRenderer 作为参数。但这已经不可能了,因此您应该使用 VideoTrack 的 addSink(VideoSink sink) 方法。 SurfaceViewRenderer 对象实现了 VideoSink onFrame(VideoFrame frame) 方法来完成这项工作。

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

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

【讨论】:

  • 是的,我自己意识到了这一点,但忘记了这个问题来发布答案......你做得很好,非常感谢!
  • 有人知道在哪里可以找到有关此更改的一些文档吗?我找不到任何关于addSink()
  • 我找不到课程org.webrtc.VideoRenderer。知道是否将其移至其他文件。找不到任何有关此的官方(或非官方)更改日志。
  • @Entreco 目前还没有这个库的文档 - 它仍处于开发阶段
  • @Mudassir 有 5 个新版本的 webrtc 库,所以这些可能已经过时了。我正在使用 atm 的版本和回答的方法正在工作:'org.webrtc:google-webrtc:1.0.23171'
【解决方案2】:
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) 可能会在下次初始化时崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多