在webrtc源码分析之视频采集之一中,主要分析了视频采集与分发的流程以及涉及到的主要类,接下来分析一下这些主要类的对象是何时创建和关联起来的。
视频采集
视频采集主要类的对象的创建和关联过程是在java层完成的,以camera1.0接口为例,流程如下所示,比较简单,就不具体介绍了,主要是android camera开发相关东西,camera开发的坑Google已经帮我们踩了。
视频分发
视频分发主要类的对象的创建和关联过程是由PeerConnectionClient的以下代码完成的:
private VideoTrack createVideoTrack(VideoCapturer capturer) {
videoSource = factory.createVideoSource(capturer);
capturer.startCapture(videoWidth, videoHeight, videoFps);
localVideoTrack = factory.createVideoTrack(VIDEO_TRACK_ID, videoSource);
localVideoTrack.setEnabled(renderVideo);
localVideoTrack.addSink(localRender);
return localVideoTrack;
}
创建流程和简化后的主要对象如下所示:
video_dispatch_init_class.jpg因为在java层和native层存在相同的类名,上图中用黄色来表示java层类,用紫色来表示native层类。上面的类图为了简洁,去掉了父类和接口信息,而代码中很多对象是用父类和接口来表示,因此看代码时可以结合webrtc源码分析之视频采集之一的下面类图来分析,这个图都是native层的类。
通过以上流程,在java层和native层创建了source、track、sink等主要的对象,并将这些对象关联起来,流程主要如下:
step2~step13,根据VideoCapturer对象创建VideoSource,VideoCapturer和VideoSource通过AndroidVideoTrackSourceObserver关联起来,AndroidVideoTrackSourceObserver对象和VideoSource对象的nativeSource成员对应的都是native层的AndroidVideoTrackSource对象,后面来自VideoCapturer对象的图像数据就可以经过AndroidVideoTrackSourceObserver传递给native层的AndroidVideoTrackSource对象,最后通过VideoBroadcaster分发到sink对象上。
step13~step18,根据VideoSource对象创建VideoTrack,主要是创建了native层的VideoTrack对象,video_source_成员就是上面流程中创建的AndroidVideoTrackSource对象,这样track就和source关联起来,往track添加sink其实是添加到source上。
step19~step25,往VideoTrack添加VideoSink对象,流程最后其实是把创建的native层的VideoSinkWrapper对象添加到AndroidVideoTrackSource的broadcaster_成员中,VideoSinkWrapper对象的j_sink_成员引用的是是java层的VideoSink对象,这样就可以从native层回调到java层。可以往VideoTrack中添加多个VideoSink对象,demo中添加了一个用于本地预览的SurfaceViewRenderer对象(真正添加到track中其实是SurfaceViewRenderer的代理对象ProxyVideoSink),而用于编码传输的VideoStreamEncoder对象是在建立RTP传输会话时由PeerConnection来创建和添加的,因此需要将VideoTrack信息添加到PeerConnection对象中,相关代码如下所示:
mediaStream = factory.createLocalMediaStream("ARDAMS");
if (videoCallEnabled) {
mediaStream.addTrack(createVideoTrack(videoCapturer));
}
mediaStream.addTrack(createAudioTrack());
peerConnection.addStream(mediaStream);
可见是先把VideoTrack对象添加到MediaStream中,再将MediaStream添加到PeerConnection对象中,这部分的内容等后续分析编码和传输流程时再来整理。
总结
本文介绍了视频采集和视频分发过程主要对象的创建和关联过程,结合webrtc源码分析之视频采集之一这篇文章,应该可以把视频采集主要流程搞清楚,当然webrtc还支持其他的平台的视频采集,后续有需要的时候再来分析。
网友评论