如何从采集设备采集视频数据

1. 采集设备内存

  • 每一个 Pro Capture 采集设备上都有一个板载内存,输入信号源的数据在采集后首先会存放在板载内存中;
  • 板载内存可以缓存多帧数据,最大值依据采集卡的型号而有所不同,可以通过 MWGetVideoBufferInfo() 获取板载缓存的最大缓冲帧数;

2. 事件通知机制

  • MWRegisterNotify() 注册一个通知事件对象, 可以设置一个或多个通知类型掩码;
  • 事件对象为有信号状态时,可以使用 MWGetNotifyStatus() 获取获取当前的通知类型;
  • 如果设置了 MWCAP_NOTIFY_VIDEO_FRAME_BUFFERED 通知,当输入视频帧的数据已经完全填充到板载内存缓冲区时,应用程序就可以收到该通知,此时就从板载内存向目标内存区域进行 DMA 数据传输了;
  • 如果设置了 MWCAP_NOTIFY_VIDEO_FRAME_BUFFERING 通知,当输入视频帧的数据开始填充板载内存缓冲区时, 应用程序可以收到该通知,此时就进行低延时视频采集;
  • 其他的通知定义请参见开发手册;

3. SDK 中提供的两种采集视频数据方法

  1. 每一个 Pro Capture 采集设备上都有一个板载内存,输入信号源的数据在采集后首先会存放在板载内存中;
  2. 板载内存可以缓存多帧数据,最大值依据采集卡的型号而有所不同,可以通过 MWGetVideoBufferInfo() 获取板载缓存的最大缓冲帧数;

方法 1 中采集帧率固定,跟随输入源信号的帧率;同时需要注册通知事件对象,通过 WaitForSingleObject() 等待到事件状态为有效
且通知类型为 MWCAP_NOTIFY_VIDEO_FRAME_BUFFERED 或是 MWCAP_NOTIFY_VIDEO_FRAME_BUFFERING 就可以采集视频数据了。

方法 2 中采集帧率可以自定义设置,需要注册时间事件对象,MWScheduleTimer() 中依据不同帧率设置时间调度值, WaitForSingleObject() 等待到这个
时间事件状态为有效后,就可以采集视频数据。

如果希望进行低延时采集, 只可以使用方法 1 (byInput)

4. 视频采集流程

  1. 在采集之前可根据需要准备一块内存区域用于存储采集的视频帧数据;
  2. MWCaptureVideoFrameToVirtualAddress() 将板载缓存中视频帧数据通过 DMA 写入到系统内存中;函数参数中 pbFrame 就是已经分配的内存指针; iFrame 为待采集的视频帧序号,这个值可以设定为视频缓冲信息结构体 MWCAP_VIDEO_BUFFER_INFO 中 iNewestBufferedFullFrame (最新缓冲好的帧序号)
  3. MWCaptureVideoFrameToPhysicalAddressEx() 是扩展函数,可以灵活设置更多采集参数,以及添加 OSD 等功能;
  4. MWCaptureVideoFrameToVirtualAddress() 为异步函数,必须使用 WaitForSingleObject() 等待采集结束,MWGetVideoCaptureStatus() 可以获取采集是否完成;

综上,采集设备会先将视频帧数据缓存到板载卡的内存中,然后将数据通过 DMA 传输到指定的内存地址中;采集参数可以使用 MWCaptureVideoFrameToVirtualAddress() 设置,以实现不同的采集效果。

示例 Examples \ CmdLineTools\CaptureByInput 有对方法 1 的调用示范;示例 Examples \ CmdLineTools\CaptureByTimer 有对方法 2 的调用示范。

联系人