我正在开发一个自定义视频播放器。我在我的架构中混合使用 DirectShow/Media Foundation。基本上,我使用 DS 来抓取 VOB 帧(MF 不支持)。我能够从 DirectShow 获取示例,但仍无法将其传递给渲染器。在 MF 中,我获取 Direct3DSurface9(来自 IMFSample),并使用 IDirect3D9Device 将其呈现在后台缓冲区上。
使用 DirectShow,我将 IMediaSample 作为我的数据缓冲区对象。我不知道如何转换并将其作为 IMFSample 传递。我发现其他人从示例中获取位图信息并使用 GDI+ 进行渲染。但我的视频数据可能并不总是有 RGB 数据。我希望从 IMediaSample 获取 IDirect3DSurface9 或 IMFSample 并将其传递给渲染,这样我就不必担心颜色空间转换。
我对此很陌生。如果我错了,请纠正我。 谢谢
最佳答案
您从 DirectShow 中的上游解码器获得的
IMediaSample
只是内存支持缓冲区的包装器。它后面没有也不可能有任何 D3D
表面(除非您自己处理它并提供自定义分配器,在这种情况下您首先不会有问题)。因此,您需要将此缓冲区中的数据内存复制到 MF
示例缓冲区中。
您遇到的问题是您希望缓冲区格式(媒体类型)匹配,以便您可以复制而无需转换。其中一种方法(可能有几种)是首先建立 MF 管道,并找出视频硬件上的缓冲区为您提供的确切像素类型。然后,通过使用相应的采集器初始化或色彩空间转换过滤器,或通过色彩空间转换 DMO
/,确保
.DirectShow
管道中具有此像素格式和媒体类型MFT
关于directshow - IMediaSample(DirectShow) 到 IDirect3DSurface9/IMFSample(MediaFoundation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9161213/