webrtc 视频采集的处理

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

首先定义一个VideoTrackSource ,

class CapturerTrackSource : public webrtc::VideoTrackSource {

。。。

具体后面说明

}

 

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

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

webrtc::MethodCall0<SimplePeerConnection, void> callCreate(this, &SimplePeerConnection::createVcmVideoSource);
callCreate.Marshal(RTC_FROM_HERE, g_worker_thread.get());

 

接着创建video track

rtc::scoped_refptr<webrtc::VideoTrackInterface> 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<VideoFrame>* sink,
const rtc::VideoSinkWants& wants) override {}
void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* 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<CapturerTrackSource> Create() {
const size_t kWidth = 640;
const size_t kHeight = 480;
const size_t kFps = 30;
const size_t kDeviceIndex = 0;
std::unique_ptr<webrtc::VcmCapturer> capturer = absl::WrapUnique(
webrtc::VcmCapturer::Create(kWidth, kHeight, kFps, kDeviceIndex));
if (!capturer) {
return nullptr;
}
return new rtc::RefCountedObject<CapturerTrackSource>(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_可以用来对数据做转换(适配)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值