分别做了视频和音频的网络传输FILTER,GraphFilter中测试正常。用程序加载,视频没有问题,音频却有问题:找到Layer-3 编码器:
WCHAR sMEPGL3[] = L"@device:cm:{33D9A761-90C8-11D0-BD43-00A0C911CE86}\\85MPEG Layer-3"; IBindCtx *pBindCtx;
CreateBindCtx(0, &pBindCtx);
ULONG chEaten = 0;
IMoniker *pMoniker = 0;
MkParseDisplayName(pBindCtx, sMEPGL3, &chEaten, &pMoniker);
pBindCtx->Release();
pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&mpgl3);
连接filter: hr = g_pGraph->AddFilter(pSrc,devicename.AllocSysString());
if (FAILED(hr))
{
pSrc->Release();
return FALSE;
}
g_pGraph->AddFilter(mpgl3,L"MPEG13");
hr=g_pGraph->AddFilter(netsend,L"netsend2");
IEnumPins* pins;
pSrc->EnumPins(&pins);
IPin* psrc;
while(S_OK==(hr=pins->Next(1,&psrc,NULL)))
{
PIN_DIRECTION der;
psrc->QueryDirection(&der);
if(der==PINDIR_OUTPUT)
break;
}
pins->Release(); if (FAILED(hr))
{
pSrc->Release();
return FALSE;
}
mpgl3->EnumPins(&pins);
IPin* pout;
IPin* pin;
pins->Next(1,&pin,NULL);
pins->Next(1,&pout,NULL);
pins->Release();
netsend->EnumPins(&pins);
IPin* pin2;
pins->Next(1,&pin2,NULL);
pins->Release();
AM_MEDIA_TYPE* pmt=NULL;
IEnumMediaTypes* enumt=NULL;
hr=pout->EnumMediaTypes(&enumt);
hr=enumt->Next(1,&pmt,NULL);
hr=g_pGraph->ConnectDirect(psrc,pin,NULL);
if (FAILED(hr))
{
pSrc->Release();
return FALSE;
}
hr=g_pGraph->ConnectDirect(pout,pin2,pmt);
if(FAILED(hr))
{
pSrc->Release();
return FALSE;
}
程序显示一切正常,但Run后发现,pin2根本得不到数据。非常奇怪,在GraphEdit中一切正常。
netsend的GetMediaType如下:
HRESULT
CInputPin::GetMediaType (
IN int iPos,
OUT CMediaType * pmt
)
{
ASSERT (pmt) ; if (iPos == 0) { pmt -> InitMediaType () ;
pmt->majortype = MEDIATYPE_Audio;
pmt->subtype = TIME_FORMAT_NONE; return S_OK ;
} return VFW_S_NO_MORE_ITEMS ;
}HRESULT
CInputPin::CheckMediaType (
IN const CMediaType * pmt
)
{
return NOERROR ;
}
WCHAR sMEPGL3[] = L"@device:cm:{33D9A761-90C8-11D0-BD43-00A0C911CE86}\\85MPEG Layer-3"; IBindCtx *pBindCtx;
CreateBindCtx(0, &pBindCtx);
ULONG chEaten = 0;
IMoniker *pMoniker = 0;
MkParseDisplayName(pBindCtx, sMEPGL3, &chEaten, &pMoniker);
pBindCtx->Release();
pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&mpgl3);
连接filter: hr = g_pGraph->AddFilter(pSrc,devicename.AllocSysString());
if (FAILED(hr))
{
pSrc->Release();
return FALSE;
}
g_pGraph->AddFilter(mpgl3,L"MPEG13");
hr=g_pGraph->AddFilter(netsend,L"netsend2");
IEnumPins* pins;
pSrc->EnumPins(&pins);
IPin* psrc;
while(S_OK==(hr=pins->Next(1,&psrc,NULL)))
{
PIN_DIRECTION der;
psrc->QueryDirection(&der);
if(der==PINDIR_OUTPUT)
break;
}
pins->Release(); if (FAILED(hr))
{
pSrc->Release();
return FALSE;
}
mpgl3->EnumPins(&pins);
IPin* pout;
IPin* pin;
pins->Next(1,&pin,NULL);
pins->Next(1,&pout,NULL);
pins->Release();
netsend->EnumPins(&pins);
IPin* pin2;
pins->Next(1,&pin2,NULL);
pins->Release();
AM_MEDIA_TYPE* pmt=NULL;
IEnumMediaTypes* enumt=NULL;
hr=pout->EnumMediaTypes(&enumt);
hr=enumt->Next(1,&pmt,NULL);
hr=g_pGraph->ConnectDirect(psrc,pin,NULL);
if (FAILED(hr))
{
pSrc->Release();
return FALSE;
}
hr=g_pGraph->ConnectDirect(pout,pin2,pmt);
if(FAILED(hr))
{
pSrc->Release();
return FALSE;
}
程序显示一切正常,但Run后发现,pin2根本得不到数据。非常奇怪,在GraphEdit中一切正常。
netsend的GetMediaType如下:
HRESULT
CInputPin::GetMediaType (
IN int iPos,
OUT CMediaType * pmt
)
{
ASSERT (pmt) ; if (iPos == 0) { pmt -> InitMediaType () ;
pmt->majortype = MEDIATYPE_Audio;
pmt->subtype = TIME_FORMAT_NONE; return S_OK ;
} return VFW_S_NO_MORE_ITEMS ;
}HRESULT
CInputPin::CheckMediaType (
IN const CMediaType * pmt
)
{
return NOERROR ;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货