Winapi 颜色转换器DSP的IMF转换接口,在设置输入类型/设置输出类型时给出E_INVALIDARG 我尝试使用彩色转换器DMO()通过媒体基础将RBG24转换为YV12/NV12。我已经通过CLSID_CColorConvertDMO创建了一个颜色转换器DSP实例,然后尝试设置所需的输入/输出类型,但即使使用由GetOutputAvailableType和GetInputAvailableType返回的媒体类型,调用也始终返回E_INVALIDARG。如果我将媒体类型设置为NULL,则会出现媒体类型无效的错误,这是有道理的。我看过MSDN的例子,人们也这么做——枚举可用的类型,然后将它们设置为输入类型——他们声称这是有效的,但我还是有点被E_INVALIDARG卡住了。我知道没有代码示例很难回答这个问题,如果没有人有类似的经验,我会尝试发布一个snipplet,但可能有人遇到过同样的问题?

Winapi 颜色转换器DSP的IMF转换接口,在设置输入类型/设置输出类型时给出E_INVALIDARG 我尝试使用彩色转换器DMO()通过媒体基础将RBG24转换为YV12/NV12。我已经通过CLSID_CColorConvertDMO创建了一个颜色转换器DSP实例,然后尝试设置所需的输入/输出类型,但即使使用由GetOutputAvailableType和GetInputAvailableType返回的媒体类型,调用也始终返回E_INVALIDARG。如果我将媒体类型设置为NULL,则会出现媒体类型无效的错误,这是有道理的。我看过MSDN的例子,人们也这么做——枚举可用的类型,然后将它们设置为输入类型——他们声称这是有效的,但我还是有点被E_INVALIDARG卡住了。我知道没有代码示例很难回答这个问题,如果没有人有类似的经验,我会尝试发布一个snipplet,但可能有人遇到过同样的问题?,winapi,visual-c++,video,ms-media-foundation,Winapi,Visual C++,Video,Ms Media Foundation,这个DMO/DSP是双接口的,它既是带有IMediaObject的DMO,也是带有imfttransform的MFT。这两个接口有很多共同之处,下面是一段代码片段,用于测试RGB24到YV12转换的初始化: #include "stdafx.h" #include <dshow.h> #include <dmo.h> #include <wmcodecdsp.h> #pragma comment(lib, "strmiids.lib") #pragma co

这个DMO/DSP是双接口的,它既是带有
IMediaObject
的DMO,也是带有
imfttransform
的MFT。这两个接口有很多共同之处,下面是一段代码片段,用于测试RGB24到YV12转换的初始化:

#include "stdafx.h"
#include <dshow.h>
#include <dmo.h>
#include <wmcodecdsp.h>

#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "wmcodecdspuuid.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    ATLVERIFY(SUCCEEDED(CoInitialize(NULL)));
    CComPtr<IMediaObject> pMediaObject;
    ATLVERIFY(SUCCEEDED(pMediaObject.CoCreateInstance(CLSID_CColorConvertDMO)));
    VIDEOINFOHEADER InputVideoInfoHeader;
    ZeroMemory(&InputVideoInfoHeader, sizeof InputVideoInfoHeader);
    InputVideoInfoHeader.bmiHeader.biSize = sizeof InputVideoInfoHeader.bmiHeader;
    InputVideoInfoHeader.bmiHeader.biWidth = 1920;
    InputVideoInfoHeader.bmiHeader.biHeight = 1080;
    InputVideoInfoHeader.bmiHeader.biPlanes = 1;
    InputVideoInfoHeader.bmiHeader.biBitCount = 24;
    InputVideoInfoHeader.bmiHeader.biCompression = BI_RGB;
    InputVideoInfoHeader.bmiHeader.biSizeImage = 1080 * (1920 * 3);
    DMO_MEDIA_TYPE InputMediaType;
    ZeroMemory(&InputMediaType, sizeof InputMediaType);
    InputMediaType.majortype = MEDIATYPE_Video;
    InputMediaType.subtype = MEDIASUBTYPE_RGB24;
    InputMediaType.bFixedSizeSamples = TRUE;
    InputMediaType.bTemporalCompression = FALSE;
    InputMediaType.lSampleSize = InputVideoInfoHeader.bmiHeader.biSizeImage;
    InputMediaType.formattype = FORMAT_VideoInfo;
    InputMediaType.cbFormat = sizeof InputVideoInfoHeader;
    InputMediaType.pbFormat = (BYTE*) &InputVideoInfoHeader;
    const HRESULT nSetInputTypeResult = pMediaObject->SetInputType(0, &InputMediaType, 0);
    _tprintf(_T("nSetInputTypeResult 0x%08x\n"), nSetInputTypeResult);
    VIDEOINFOHEADER OutputVideoInfoHeader = InputVideoInfoHeader;
    OutputVideoInfoHeader.bmiHeader.biBitCount = 12;
    OutputVideoInfoHeader.bmiHeader.biCompression = MAKEFOURCC('Y', 'V', '1', '2');
    OutputVideoInfoHeader.bmiHeader.biSizeImage = 1080 * 1920 * 12 / 8;
    DMO_MEDIA_TYPE OutputMediaType = InputMediaType;
    OutputMediaType.subtype = MEDIASUBTYPE_YV12;
    OutputMediaType.lSampleSize = OutputVideoInfoHeader.bmiHeader.biSizeImage;
    OutputMediaType.cbFormat = sizeof OutputVideoInfoHeader;
    OutputMediaType.pbFormat = (BYTE*) &OutputVideoInfoHeader;
    const HRESULT nSetOutputTypeResult = pMediaObject->SetOutputType(0, &OutputMediaType, 0);
    _tprintf(_T("nSetOutputTypeResult 0x%08x\n"), nSetOutputTypeResult);
    // TODO: ProcessInput, ProcessOutput
    pMediaObject.Release();
    CoUninitialize();
    return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括
#pragma注释(lib,“strmids.lib”)
#pragma注释(lib,“wmcodedsdspuid.lib”)
int _tmain(int argc,_TCHAR*argv[]
{
ATLVERIFY(成功(协同初始化(NULL));
CComPtr pMediaObject;
ATLVERIFY(成功(pMediaObject.CoCreateInstance(CLSID_CColorConvertDMO));
VIDEOINFOHEADER输入VIDEOINFOHEADER;
零内存(&InputVideoInfoHeader,InputVideoInfoHeader的大小);
InputVideoInfoHeader.bmiHeader.biSize=InputVideoInfoHeader.bmiHeader的大小;
InputVideoInfoHeader.bmiHeader.biWidth=1920;
InputVideoInfoHeader.bmiHeader.biHeight=1080;
InputVideoInfoHeader.bmiHeader.biPlanes=1;
InputVideoInfoHeader.bmiHeader.biBitCount=24;
InputVideoInfoHeader.bmiHeader.biCompression=BI_RGB;
InputVideoInfoHeader.bmiHeader.biSizeImage=1080*(1920*3);
DMO_媒体_类型InputMediaType;
零内存(&InputMediaType,InputMediaType的大小);
InputMediaType.majortype=MEDIATYPE\u视频;
InputMediaType.subtype=MEDIASUBTYPE_RGB24;
InputMediaType.bFixedSizeSamples=TRUE;
InputMediaType.bTemporalCompression=FALSE;
InputMediaType.lSampleSize=InputVideoInfoHeader.bmiHeader.biSizeImage;
InputMediaType.formattype=格式\视频信息;
InputMediaType.cbFormat=InputVideoInfoHeader的大小;
InputMediaType.pbFormat=(字节*)&InputVideoInfoHeader;
const HRESULT nSetInputTypeResult=pMediaObject->SetInputType(0,&InputMediaType,0);
_tprintf(_T(“nSetInputTypeResult 0x%08x\n”)、nSetInputTypeResult;
VIDEOINFOHEADER输出VIDEOINFOHEADER=输入VIDEOINFOHEADER;
OutputVideoInfoHeader.bmiHeader.biBitCount=12;
OutputVideoInfoHeader.bmiHeader.biCompression=MAKEFOURCC('Y','V','1','2');
OutputVideoInfoHeader.bmiHeader.biSizeImage=1080*1920*12/8;
DMO_MEDIA_TYPE OutputMediaType=InputMediaType;
OutputMediaType.subtype=MEDIASUBTYPE_YV12;
OutputMediaType.lSampleSize=OutputVideoInfoHeader.bmiHeader.biSizeImage;
OutputMediaType.cbFormat=OutputVideoInfoHeader的大小;
OutputMediaType.pbFormat=(字节*)&OutputVideoInfoHeader;
const HRESULT nsetouttyperesult=pMediaObject->SetOutputType(0,&OutputMediaType,0);
_tprintf(_T(“nsetouttyperesult 0x%08x\n”),nsetouttyperesult);
//TODO:ProcessInput、ProcessOutput
pMediaObject.Release();
coninitialize();
返回0;
}

这应该可以很好地工作,并打印出两个
S_OK
S…

,因为这样做有效,通过使用<代码> MFInitMediaTypeFromAMMediaType < />代码创建了相应的<代码> IMFMediaType <代码>,并与我通过的内容进行了比较,并返回了<代码> GETIMPUTAVAABLYTYPE -似乎,对于可用类型,媒体基础只设置视频类型,但忽略了交错、跨步等多个参数,等。希望这对其他人也有帮助。