美文网首页
启用本地摄像头已经相关类的关系分析

启用本地摄像头已经相关类的关系分析

作者: shuinan | 来源:发表于2019-07-29 21:15 被阅读0次

    如果想启动摄像头,并预览视频,m76中的做法是:

    首先定义一个VideoTrackSource ,

    class CapturerTrackSource : public webrtc::VideoTrackSource {

    。。。

    具体后面说明

    }

    之后创建该VideoTrackSource 的一个实例,这个实例用于后面创建VideoTrack。

    不过,创建的使用要注意后续释放这个对象是要保持在同一个线程,所以如下创建:

    webrtc::MethodCall0 callCreate(this, &SimplePeerConnection::createVcmVideoSource);

    callCreate.Marshal(RTC_FROM_HERE, g_worker_thread.get());

    接着创建video track

    rtc::scoped_refptr video_track(

    g_peer_connection_factory->CreateVideoTrack(kVideoLabel,

    localVideoTrackSource_));

    监听视频流

    video_track->AddOrUpdateSink(&((MediaStream*)local_stream_.get())->videoObserver(), rtc::VideoSinkWants());

    +++++++++++++++++++++++++++++++++++++++++++++++

    分析一下VideoTrackSource和videoTrack的关系

    videoTrack实现VideoTrackInterface,有下面三个重要接口:

    void AddOrUpdateSink(rtc::VideoSinkInterface* sink,

    const rtc::VideoSinkWants& wants) override {}

    void RemoveSink(rtc::VideoSinkInterface* sink) override {}

    virtual VideoTrackSourceInterface* GetSource() const = 0;

    实际上,是通过 GetSource(),找到source,然后在AddOrUpdateSink,RemoveSink时,调用source的对应方法,将数据的消费者注册到source里面

    所以VideoTrackSource实际上组织VideoTrack和TrackSource,为他们搭上关系

    因此,VideoTrackSource要一个VideoSource,用于代理track的AddOrUpdateSink,RemoveSink

    具体来说:

    class CapturerTrackSource : public webrtc::VideoTrackSource

    里面有一个Create函数, 创建了一个VcmCapturer,这个一个VideoSource

    static rtc::scoped_refptr Create() {

    const size_t kWidth = 640;

    const size_t kHeight = 480;

    const size_t kFps = 30;

    const size_t kDeviceIndex = 0;

    std::unique_ptr capturer = absl::WrapUnique(

    webrtc::VcmCapturer::Create(kWidth, kHeight, kFps, kDeviceIndex));

    if (!capturer) {

    return nullptr;

    }

    return new rtc::RefCountedObject(std::move(capturer));

    }

    有几层继承关系

    class VcmCapturer : public CustomVideoCapturer, public rtc::VideoSinkInterface<VideoFrame> {

        VcmCapturer本身主要用于启动物理摄像头

    class CustomVideoCapturer : public rtc::VideoSourceInterface<VideoFrame> {

    。。。

    里面有:

    rtc::VideoBroadcaster broadcaster_;

    cricket::VideoAdapter video_adapter_;

    帮忙 VcmCapturer 处理掉AddOrUpdateSink,RemoveSink

    video_adapter_可以用来对数据做转换(适配)

    https://my.oschina.net/u/4249347/blog/4453525  一篇视频处理的文档

    相关文章

      网友评论

          本文标题:启用本地摄像头已经相关类的关系分析

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