chromium VideoCapture

翻译:https://www.chromium.org/developers/design-documents/video-capture

总览


        有多个组件允许在Chrome中进行视频捕获

  • Browser端类
  • 支持所有MediaStream用例的通用Render基础结构
  • 本地<video>回放和/或Jingle / WebRtc PeerConnection实现。

        在最高级别,视频和音频捕获都被抽象为MediaStream。通过使用适当的参数包调用GetUserMedia()创建此JS实体。幕后发生的事情和什么类做什么工作是本文档的主题。我将谈论视频捕获,尽管有些概念可以与音频互换。我将谈论WebCam / Camera,但相同的理由也适用于视频数字化仪,虚拟WebCam等。

Browser

        在Cr沙箱模型中,与使用硬件有关的所有内容都在browser进程中抽象化,Render进程通过IPC机制将请求定向到该进程程,Video Capture也不例外。
        这组类的目的是枚举,打开和关闭用于捕获的设备,处理捕获的帧并保持底层资源的负担。

        在browser层,应该没有在用户首次尝试枚举或使用任何类型的捕获(视频或音频)设备之前创建的设备专用代码,即没有非单例代码,这就是为什么“视频在实际使用任何捕获设备之前,chrome:// media-internals下的“捕获设备功能”为空。

        让我们看一下该图。在Chrome启动初期,只有一个类,MediaStreamManager(MSM)在左上角。 MSM是由UI线程上的BrowserMainLoop创建和拥有的单例类,它使用一堆MediaStream *类通过IPC进行对话并向用户请求权限(MediaStreamUI *)。 MS *类处理音频和视频。

// VideoCaptureManager is used to open/close, start/stop, enumerate available
// video capture devices, and manage VideoCaptureController's.
// In its main usage in production, an instance is created by MediaStreamManager
// on the Browser::IO thread. All public methods are expected to be called from
// the Browser::IO thread. A device can only be opened once

      MSM在构造上创建其他两个重要的单例,即引用计数的VideoCaptureManager(VCM)和关联的VideoCaptureDeviceFactory(VCDF)。 VCDFactory用于枚举设备名称及其功能(如果有),并实例化VCDevices。每个平台有一个实现,有几个可用的实现:

  • 特定于平台:Linux / CrOS(基于V4L2 API),Mac(QTKit和AVFoundation API),Windows(DirectShow和Media Foundation API)和Android(Camera和Camera2 API)。
  • 调试/测试设备:FakeVCD和FileVCD。 FakeVCD使用滚动的PacMan在绿色画布上生成流,而FileVCD播放未压缩的Y4M文件。
  • 其他捕获:桌面和选项卡(Web内容)捕获。

        VCM管理<VideoCaptureController,VideoCaptureDevice>的生命周期。 VideoCaptureDevices(VCD)是操作系统为Video Capture和VideoCaptureController(VCC)提供的基础结构之间的适配层,后者的任务是通过IPC将捕获的帧桥接到Render客户端。

        VCC通过VideoCaptureHosts(VCH)列表与Render进行交互。 VCH是从Render到VCM的命令(VideoCaptureHos)与从VCC到Renderer的命令之间的双重桥梁。 VCHost与Render一样多,它们是由RenderProcessHostImpl创建的。

        大数据块无法通过IPC管道传递,因此在VideoCaptureBufferPool中实现了共享内存机制(VCBP-不在图中,位于VCC内部)。这些基于ShMem的“缓冲区”(被混淆地称为)是按需分配的,并保留给生产者或消费者。当所有客户端都发送了相应的释放消息时,VCC会记账并回收它们。

        VideoFrame无法从该缓冲池中了解缓冲区,因此VCC必须保留它们的计数并再次通过IPC回收其使用。

        捕获设备没有提供渲染方要求或需要的内容是相对常见的,因此在VCC和VCD之间插入了一个适配层:VideoCaptureDeviceClient。 VCDClient调整大小,应用旋转,否则将传入的像素格式转换为YUV420,这是全局传输像素格式。这种转换装备的输出是一个ref-counted VideoFrame,它是通用的视频传输类。整个VCD都假定有同步捕获回调,因此VCDC将捕获的缓冲区复制/转换到分配为“缓冲区”的ShMem上。然后,将此VideoFrame-Buffer对复制到VCController上的每个VCHost。

猜你喜欢

转载自blog.csdn.net/LIJIWEI0611/article/details/108286820