私はこのライブラリを使用しています: 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
そうです、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);
この結論に到達するために、参照として同じ公式サンプルアプリを使用しましたが、それは私にとっては問題なく機能します。
_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)
を直接割り当てると、次の初期化でクラッシュする可能性があるため、このコードを試してください。