使用视频帧

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

未压缩的视频是快速连续播放的位图序列,通常以大约每秒 30 帧的速度播放。 由于大多数视频以压缩格式进入 DirectShow 筛选器图,因此视频流通常会通过解码器进行解压缩。 许多解码器以 YUV 格式输出数据,并在呈现之前将视频硬件的最终转换保留为 RGB。 如果解码器使用 DirectX 视频加速,则视频硬件将执行额外的工作来解码图像。 因此,在数据到达视频硬件之前,可能不会执行位图的最终解压缩。

但是,若要执行多种类型的视频分析、处理或编辑,通常需要在呈现或写入文件之前处理某种类型 RGB 或 YUV 格式的未压缩位图。 这项工作通常在基于 CTransformFilter 基类的转换筛选器中完成,特别是在 Transform 方法中。 此方法接收指向封装视频数据的 IMediaSample 对象的指针。 IMediaSample::GetPointer 方法返回指向原始数据的第一个字节的指针。 对于未压缩的帧,此数据包含可由筛选器直接访问或修改的像素。 以下部分提供了有助于以这种方式有效处理 DIB 数据的背景信息。

注意

也可以使用 GDI、GDI+、DirectDraw 或 Direct3D 函数修改位,但这些技术不在本文讨论范围内。

 

本节包含下列主题: