IMFTransform隐蔽相机流颜色格式,IMFTransform :: ProcessOutput返回冻结图像数据

问题描述 投票:0回答:1

我是Windows Media Foundation API的新手。我尝试创建一个可以显示和操作摄像机视频输入流的程序。 我正在使用Media Foundation进行视频流阅读,支持的颜色格式是NV12,所以我不得不将其转换为RGBARGB来创建Opengl纹理对象。 我尝试在CPU端使用纯c ++代码来完成它,但性能非常糟糕。然后我尝试用IMFTranform做色彩转换,性能非常好,但是我遇到了一个奇怪的问题。 IMFTransform::Process返回S_OK,但我一直得到冻结的图像输出。结果图像像素不会实时更新,不断冻结许多帧,并且冻结时间越来越长。如果我使用纯c ++代码进行颜色转换,那么一切正常。

这是我的代码,qazxsw poi。请让我知道你认为我做错了什么。

camera ms-media-foundation color-conversion
1个回答
0
投票

您是否尝试让SourceReader为您执行转换:

https://gist.github.com/zhiqiang-li/16d1a6a1b00e8fb39847c8ca323b5604

默认情况下,源阅读器和接收器编写器可以对未压缩的音频和视频流执行某些格式转换。要禁用此行为,请在创建源阅读器或接收器编写器时将此属性设置为TRUE。

默认情况下它为FALSE,因此您不需要显式设置此属性。

然后 :

hr = mAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, FALSE);

用:

hr = mSourceReader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);

还可以根据NV12格式(MF_MT_FRAME_SIZE)计算图像大小。不要设置MF_MT_DEFAULT_STRIDE,SourceReader会为你做。

因此,即使捕获源提供RGB32格式,也可以从SourceReader获取NV12格式。 SourceReader通常能够做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.