编写视频图像示例
[与此页面关联的功能 Windows Media Format 11 SDK 是一项旧功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用源读取器和接收器编写器,而不是 Windows Media 格式 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
视频图像流是包含一系列静止图像的视频。 图像可以在帧内移动,每个图像可以混合到下一个帧中。 视频图像流使用 Windows Media Video 9 Image v2 编解码器进行编码。 输出视频类似于 Windows Media Video 9 编解码器创建的视频。
若要创建包含视频图像流的配置文件,请首先枚举视频编解码器,如 从编解码器获取流配置信息中所述。 搜索支持 WMMEDIASUBTYPE_WVP2 子类型的编解码器。
在编写器对象上设置配置文件后,调用 IWMWriter::GetInputProps 以获取视频图像输入流的媒体属性。 通过调用 IWMMediaProps::GetMediaType 从媒体属性对象获取媒体类型,并将子类型更改为WMMEDIASUBTYPE_VIDEOIMAGE。 应将视频宽度和高度设置为包含要添加到流中的图像所需的最大尺寸。 然后使用修改后的输入类型调用 IWMMediaProps::SetMediaType 。 现在,你已准备好开始将示例发送到编写器对象。
每个示例都必须以 WMT_VIDEOIMAGE_SAMPLE2 结构开头。 此外,示例可能包含位图图像。 图像仅附加到其出现的第一个帧的样本。 使用该图像的所有附加帧只需要 结构中的信息。 输入位图必须格式化为 RGB,每像素 24 位。
位图文件存储图像数据,以便图像的每一行的数据采用可被 4 整除的字节数。 (这称为 bitmap.) 这会将每一行视频的开头强制设置为 DWORD 边界,从而使复制更加高效。 如果图像行不均匀地被 4 整除,则行将填充到 4 个字节的下一个最高倍数。 附加图像数据时,必须删除每行数据末尾存在的任何填充。
Windows Media Video 9 Image v2 编解码器一次在内存中最多保留两个图像。 这些图像称为上一个图像和当前图像。 每个图像在 WMT_VIDEOIMAGE_SAMPLE2 结构中都有一组成员,这些成员指示图像在帧中的呈现方式。 可以通过将 WMT_VIDEOIMAGE_SAMPLE2 的 dwControlFlags 成员设置为WMT_VIDEOIMAGE_SAMPLE_INPUT_FRAME来添加映像。 将输入帧传递给编解码器时,该图像将成为当前图像。 上一个示例中当前图像的图像通常成为上一个图像,而上一个示例中的上一个图像的图像将被丢弃。 可以通过将 bKeepPrevImage 成员设置为 TRUE 来配置编解码器以保留以前的旧映像。 在这种情况下,将放弃上一个示例中当前图像的图像。
视频图像帧的基本构成由每个图像的两个因素决定:感兴趣区域和混合系数。 图像的感兴趣区域由原点、宽度和高度定义。 感兴趣区域描述的图像部分将填充输出帧。 如果感兴趣区域的大小与输出帧不同,则编解码器会调整其大小。 图像的混合系数决定了两个图像的混合。 当前和以前图像的混合系数总计必须为 1.0。 例如,如果 fCurrBlendCoef 设置为 0.5, fPrevBlendCoef 设置为 0.5,则输出帧由两个图像中感兴趣的区域相等混合组成。
通过操作图像的感兴趣区域,可以创建平移和缩放效果。 通过混合系数,可以在图像之间交叉淡化 (溶解) 。 除了这些效果之外,还可以使用预定义的转换之一来创建更复杂的帧。 本文档的视频 图像转换 部分介绍了可用的过渡。 使用过渡时,必须配置每个帧。 执行此操作的最简单方法是创建一个函数,该函数以增量方式更改 WMT_VIDEOIMAGE_SAMPLE2 结构的成员以产生完整效果。
有关要为变形设置的值的详细信息,请参阅 WMT_VIDEOIMAGE_SAMPLE2。
注意 如果要在包含视频图像流的文件中包括音频,则必须使用未压缩的音频输入。 若要将视频图像流与现有的压缩音频流组合在一起,必须解压缩音频并传递未压缩的样本。 如果在编写视频图像流时将压缩样本传递给编写器,则会发生错误,导致从视频中删除样本。
此外,没有音频流的压缩视频图像文件在单个 ASF 数据包中可能包含几个非常小、高度压缩的视频帧,这可能会导致以前版本的 Windows 媒体播放器 播放体验不佳。 若要避免此问题,最佳解决方案是将无提示音频流插入文件中,不过这也会增加文件大小。
相关主题