如何确定 Windows Media Foundation 接收器编写器是不是需要自下而上或自上而下的图像?

Posted

技术标签:

【中文标题】如何确定 Windows Media Foundation 接收器编写器是不是需要自下而上或自上而下的图像?【英文标题】:How does one find out whether a Windows Media Foundation sink writer needs bottom-up or top-down images?如何确定 Windows Media Foundation 接收器编写器是否需要自下而上或自上而下的图像? 【发布时间】:2017-03-25 21:10:32 【问题描述】:

我正在使用 Windows Media Foundation 创建视频文件。我有一些基于Using the Sink Writer to Encode Video 教程的代码。

当输入类型为MFVideoFormat_RGB32,输出类型为MFVideoFormat_WMV3,并且接收器写入器正在写入 WMV 文件,并且我向接收器写入器提供自上而下的 RGB32 数据时,我得到的视频是我会期待的。

另一方面,当输出类型为 MFVideoFormat_H264 时 - 其他一切都相同 - 位图颠倒显示。

如何在运行时找出需要什么样的位图数据?

【问题讨论】:

我想这最终都是关于使用MF_MT_DEFAULT_STRIDE 属性正确指示行顺序。也就是说,请确保您的原始视频 RGB 帧带有媒体类型,其中定义了 stride 并指示行顺序。 @RomanR。是的,看起来这样就行了。如果您将您的评论充实到一个答案中,那么我会将其标记为正确的,否则我会在一两天内添加我自己的答案。 【参考方案1】:

RGB 视频媒体类型可能会被赋予可选的MF_MT_DEFAULT_STRIDE attribute 来指定行顺序:

默认表面步幅,用于未压缩的视频媒体类型。步幅是从一行像素到下一行所需的字节数。 [...]

自上而下图像的步幅为正,自下而上的图像为负。

该属性是可选的,当省略时可能会导致混淆,因为数据使用者可能会应用不同的默认值。一般来说,由于历史原因,RGB 数据通常以相反的行顺序出现,但最近的 API 倾向于修复它并以正常的行顺序提供数据。

【讨论】:

以上是关于如何确定 Windows Media Foundation 接收器编写器是不是需要自下而上或自上而下的图像?的主要内容,如果未能解决你的问题,请参考以下文章

winform播放视频(windows media player)

windows media player 有啥没图像!!!

如何序列化 Windows.Media.Brush

如何确定 Media Foundation 中特定 MJPEG 子类型的色度子采样?

Windows Media Player 打不开怎么办

如何从 System.Drawing.Color 转换为 System.Windows.Media.Color?