webrtc源码分析之视频采集之二

webrtc源码分析之视频采集之一中,主要分析了视频采集与分发的流程以及涉及到的主要类,接下来分析一下这些主要类的对象是何时创建和关联起来的。

视频采集

视频采集主要类的对象的创建和关联过程是在java层完成的,以camera1.0接口为例,流程如下所示,比较简单,就不具体先容了,主要是android camera开发相关东西,camera开发的坑谷歌已经帮大家踩了。

视频分发

视频分发主要类的对象的创建和关联过程是由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还支撑其他的平台的视频采集,后续有需要的时候再来分析。

推荐阅读更多精彩内容