美文网首页WebRTC
webrtc源码分析之视频采集之二

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

作者: Jimmy2012 | 来源:发表于2018-02-02 14:51 被阅读103次

    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还支持其他的平台的视频采集,后续有需要的时候再来分析。

    相关文章

      网友评论

        本文标题:webrtc源码分析之视频采集之二

        本文链接:https://www.haomeiwen.com/subject/auiszxtx.html