IMFTransform秘密摄像机流颜色格式,IMFTransform :: ProcessOutput返回冻结图像数据

时间:2019-03-24 17:00:57

标签: camera ms-media-foundation color-conversion

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

这是我的代码,https://gist.github.com/zhiqiang-li/16d1a6a1b00e8fb39847c8ca323b5604。请让我知道您认为我做错了什么。

1 个答案:

答案 0 :(得分:0)

您是否尝试让SourceReader为您完成转换:

<mat-paginator (page)="change($event)">
</mat-paginator>

change(e.page){
   this.router.parent.navigate(e.page);
}
  

默认情况下,源读取器和接收器写入器可以对未压缩的音频和视频流执行某些格式转换。若要禁用此行为,请在创建源读取器或接收器写入器时将此属性设置为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通常可以做到这一点。