web-dev-qa-db-ja.com

Android 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

7
shurrok

そうです、APIはチュートリアルのAPIと一致しなくなりましたが、近いです。

VideoTrackにはaddRenderer(VideoRenderer renderer)メソッドがあり、SurfaceViewRendererをパラメーターとして使用してVideoRendererを作成する必要があります。しかし、それはもう不可能なので、代わりにVideoTrackのaddSink(VideoSink sink)メソッドを使用する必要があります。 SurfaceViewRendererオブジェクトは、これを機能させるためにVideoSink onFrame(VideoFrame frame)メソッドを実装します。

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

この結論に到達するために、参照として同じ公式サンプルアプリを使用しましたが、それは私にとっては問題なく機能します。

13
Andreas2762
_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)を直接割り当てると、次の初期化でクラッシュする可能性があるため、このコードを試してください。

0