不使用peerconnection如何使用webrtc的VideoCapturer?

4

是否可以在无需建立peerconnection的情况下使用webrtc VideoCapturer?

我们有一个工作正常的androidapp应用程序(来源于示例/ androidapp)。我们将以下代码从工作中的应用程序中取出到单独的活动中,其中我们直接使用摄像头捕获器而不创建peerconnection。我们使用CapturerObserver的实例来创建视频捕获器(相机2),然后尝试将其渲染到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);

我看到你和我一样有同样的问题,因为你运行了runOnUiThread() https://stackoverflow.com/questions/53441496/can-a-texture-be-updated-in-background-thread-but-printed-in-foreground-thread ,请问你是如何处理这个问题的? - zeus
@loki 的回答如下所述,有所帮助。 - Jim
1个回答

4
使用 factory.createVideoSource。您可以在创建 PeerConnection 之前使用它。您可以参考 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是做什么的以及如何表现。有人能帮我吗? - Richa Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接