WebRTC学习之六:本地视频采集

转载 2017年01月03日 14:08:45

1. WebRTC原生视频采集

在介绍视频设备的采集之前,首先要分析一下WebRTC的DeviceManager结构,因为视频采集的抽象接口VideoCapturer的WebRTC原生实现就是通过它来创建的。这个类的功能还包括枚举音视频设备的相关信息等。结构如下:


限于篇幅,该UML中没有标出DeviceManagerInterface接口的所有功能接口,具体包括:获取音频输入/输出设备列表、获取视频输入设备列表、根据设备信息创建VideoCapturer视频采集对象等。由于获取硬件设备列表,涉及到平台相关的调用,在Windows平台下的实现是Win32DeviceManager类(可以调用DeviceManagerFactory的静态方法Create()返回当前平台相应的DeviceManager对象)。关注一下DeviceWatcher,顾名思义,它的功能在于监控设备的变化。在Windows平台下的实现Win32DeviceWatcher通过API函数RegisterDeviceNotification监控视频类设备和音频类设备的变化。当有监视的类型设备发送变化时,会通过DeviceManagerInterface接口的SignalDevicesChange信号向外投递通知。最后分析一下创建VideoCapturer的流程。DeviceManager创建VideoCapturer对象时通过VideoDeviceCapturerFactory接口来完成的。VideoDeviceCapturerFactory接口的默认实现是WebRtcVideoDeviceCapturerFactory类,该类创建WebRtcVideoCapturer对象做为VideoCapturer接口的实现。可以理解成WebRtcVideoCapturer就是WebRTC原生的视频采集的实现,但这种说法不确切,因为视频采集涉及到跨平台,没这么简单。下面再细扒一下WebRtcVideoCapturer:


由于平台相关性,WebRtcVideoCapturer仍然不是视频采集的真正实现,它创建一个VideoCaptureModule接口对象来完成真正的视频采集工作。该抽象接口是视频采集的实现接口,最终在Windows平台下由VideoCaptureDS(传统的DirectShow方式)和VideoCaptureMF(Vista之后的Media Foundation API实现方式)来实现采集工作。这里要说明一下VideoCaptureMF在WebRTC中还是个空架子,还未真正实现,如果读者对Media Foundation API实现视频采集感兴趣,可以参考Chromium的media库中VideoCaptureDeviceMFWin类实现。

接下来分析一下VideoSourceInterface和VideoCapturer是如何结合,以及采集由谁驱动开始的。


VideoSource是WebRTC对VideoSourceInterface接口的实现, 它容纳一个VideoCapturer对象做为视频采集源,VideoRenderer是供外部从VideoSource中获取视频帧数据。此外VideoSource还依赖ChannelManager对象,使用它所包含的CaptureManager来负责视频的采集任务。VideoSource在创建的时候就会调用 Initialize方法中调用ChannelManager的StartVideoCapture方法开始采集视频数据。CaptureManager内部为每个VideoCapturer对象维护了一个CaptureRenderAdapter,CaptureRenderAdapter在创建的时候将OnVideoFrame成员方法挂接上VideoCapturer的SignalVideoFrame信号来实时接收采集源传送过来的视频帧数据,OnVideoFrame内部将接收到的视频帧数据分发给向其注册的VideoRenderer对象(VideoRenderer对象的注册的流程是VideoSource到ChannelManager,再到CaptureManager,最后注册到CaptureRenderAdapter与特定的VideoCapturer关联)。

至此,VideoSourceInterface在WebRTC中的实现已经很清晰了,视频采集的流程和时机也很明了,接下来顺便稍等地简单分析一下WebRTC中VideoTrackInterface接口的实现:


WebRTC创建了一个VideoTrack实现VideoTrackInterface接口,在此之前我一直有个疑问,VideoTrackInterface对外暴露的视频输出接口是VideoRendererInterface,而视频源接口VideoSourceInterface对外暴露的视频输出接口是VideoRenderer,两套接口是如何适配的。看到这里,我发现原来VideoTrack新建了一个VideoTrackRenderers对象来完成VideoRendererInterface接口到VideoRenderer接口的适配工作。VideoTrackRenderers一方面从VideoRenderer接口派生,这样就可以将自己通过VideoSourceInterface的AddSink方法挂接进去来接收视频帧数据,另一方面将接收到的视频帧数据分发给外部挂接给VideoTrackInterface的VideoRendererInterface接口。

2. Chromium对WebRTC的视频采集适配

Chromium创建WebRtcVideoCapturerAdapter类来实现VideoCapturer接口,相关结构如下:


Chromium自己也封装了Track、Source概念,所以当初看这块的时候脑袋不容易转弯费了不少心思。WebRtcVideoCapturerAdapter需要接收Chromium的视频采集模块传输过来的帧数据,通过一层层的挂接,最终挂接到MediaStreamVideoSource类中。MediaStreamVideoSource接收到视频帧数据时,再一层层地通知回来,最终通知到WebRtcVideoCapturerAdapter的OnFrameCaptured方法,该方法内部触发SignalFrameCaptured信号。

MediaStreamVideoSource封装了Chromium视频采集的入口,这块结构就复杂了,牵涉到跨进程的架构,如下:


原文链接:http://www.cnblogs.com/fangkm/p/4374610.html

WebRTC源码分析三:视频处理流程

文本介绍视频的处理流程。图1中显示了两路视频会话视频信号流过程。 以一路视频会话为例,主要分为以下几个线程: 1)视频源产生线程:Camera生产视频画面,封装成视频帧,以一定帧率投递到下一个模块...
  • neustar1
  • neustar1
  • 2014年02月19日 11:32
  • 10269

chrome 谷歌浏览器命令行大全 (List of Chromium Command Line Switches)

There are lots of command lines which can be used with the Google Chrome browser. Some change behavi...
  • u012593626
  • u012593626
  • 2015年03月22日 19:40
  • 5889

WEBRTC CAPTURE 视频采集

WEBRTC 视频采集模块,支持WINDOWS IOS ANDROID LINUX 同时支持自定义Capture 比如虚拟Capture 左边是具体平台的实现,右边是面向使用者的接口 客户通过 We...
  • doitsjz
  • doitsjz
  • 2016年06月29日 14:13
  • 1809

webrtc视频采集模块

webkit视频采集流程webrtc中平台相关视频采集模块是在video_capture_module_internal_impl中 window下采用directshow采集摄像头数据 主要流程...
  • ab7936573
  • ab7936573
  • 2017年05月27日 17:37
  • 164

WebRTC原生音频采集

 转载请注明出处:http://www.cnblogs.com/fangkm/p/4374668.html  上一篇博文介绍了本地视频采集,这一篇就介绍下音频采集流程,也是先介绍WebRTC原...
  • doitsjz
  • doitsjz
  • 2016年07月04日 22:42
  • 838

WebRTC学习之一:开篇

一.无插件的实时通讯        想像一下,如果你的手机、电视、电脑都可以通过一个平台进行通信,想像一下,你可以在Web应用中轻松地加入视频聊天和p2p数据分享,这就是WebRTC的愿景。     ...
  • caoshangpa
  • caoshangpa
  • 2016年11月23日 17:25
  • 7772

WEBRTC CAPTURE 视频采集

WEBRTC 视频采集模块,支持WINDOWS IOS ANDROID LINUX 同时支持自定义Capture 比如虚拟Capture 左边是具体平台的实现,右边是面向使用者的接口 客户通过 We...
  • doitsjz
  • doitsjz
  • 2016年06月29日 14:13
  • 1809

webrtc视频采集

webrtc\src\webrtc\test 目录中的vcm_capturer.h 和 vcm_capturer.cc 如果仅仅是采集视频,可以参考或直接用这个例子; 一般仅仅是视频数据采集,Wi...
  • chinabinlang
  • chinabinlang
  • 2017年07月27日 18:54
  • 391

WebRTC学习资料大全

在学习WebRTC,找了些资料,记录一下,供以后查询。 有些需要翻墙才能看 WebRTC 介绍 官网在这里:https://webrtc.org/。然后这里有一个官方的Getting Star...
  • caoshangpa
  • caoshangpa
  • 2016年11月08日 17:33
  • 1793

WebRTC学习资料大全

在学习WebRTC,找了些资料,记录一下,供以后查询。
  • foruok
  • foruok
  • 2016年11月02日 10:56
  • 5150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebRTC学习之六:本地视频采集
举报原因:
原因补充:

(最多只允许输入30个字)