【问题标题】:Use webrtc VideoCapturer without peerconnection?在没有对等连接的情况下使用 webrtc VideoCapturer?
【发布时间】:2018-11-05 04:47:35
【问题描述】:

是否可以在没有对等连接的情况下使用 webrtc VideoCapturer?

我们有一个工作的 androidapp 应用程序(来自示例/androidapp)。我们已将工作应用程序中的以下代码放入一个单独的活动中,在该活动中我们直接使用相机捕获器而不创建对等连接。我们使用 CapturerObserver 的实例创建一个视频捕获器(camera2),然后尝试将其渲染到 org.webrtc.SurfaceViewRenderer。下面是代码。

正如预期的那样,CapturerObserver 的 onFrameCaptured 被使用有效的 videoFrame 对象多次调用。从那里,我们将它传递给 SurfaceViewRenderer。但是,视频不会渲染,并且 SurfaceViewRenderer 保持黑色。

这是使用 VideoCapturer 和 SurfaceViewRenderer 的正确方法吗?在发送到 SurfaceViewRenderer 之前是否需要进行任何格式转换?

private class MyCapturerObserver implements CapturerObserver {
    @Override
    public void onCapturerStarted(boolean b) {
        Log.e(TAG, "capture started: " + b);
    }

    @Override
    public void onCapturerStopped() {
        Log.e(TAG, "capture stopped");
    }

    @Override
    public void onFrameCaptured(final VideoFrame videoFrame) {
        //fullscreenRenderer.onFrame(videoFrame);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                fullscreenRenderer.onFrame(videoFrame);
            }
        });

    }
}

capturer = createVideoCapturer();
captureObserver = new MyCapturerObserver();
surfaceTextureHelper =
            SurfaceTextureHelper.create("CaptureThread", eglBase.getEglBaseContext());

capturer.initialize(surfaceTextureHelper, getApplicationContext(), captureObserver);
capturer.startCapture(1280, 720, 30);

【问题讨论】:

标签: android webrtc


【解决方案1】:

使用factory.createVideoSource。您可以在创建对等连接之前使用它。您可以参考 PeerConnectionClient.java 中的源代码

public VideoTrack createVideoTrack(VideoCapturer capturer) {
    surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", rootEglBase.getEglBaseContext());
    videoSource = factory.createVideoSource(capturer.isScreencast());
    capturer.initialize(surfaceTextureHelper, appContext, videoSource.getCapturerObserver());
    capturer.startCapture(videoWidth, videoHeight, videoFps);

    localVideoTrack = factory.createVideoTrack(VIDEO_TRACK_ID, videoSource);
    localVideoTrack.setEnabled(renderVideo);
    localVideoTrack.addSink(localRender);
    return localVideoTrack;
}

【讨论】:

  • 嗨,我有一些问题,我已经从视频渲染器更改为添加接收器,但整个过程变成了两个流程。我仍然不明白 SurhfaceTextureHelper 做了什么以及如何表现。有人可以帮我解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多