VC做DirectX8的开发,这个问题搞了一周了,始终解决不掉。
已经放1000多分了,老板要发飙了,请大家帮忙看看,我会再开贴给分的。决不食言。 另外,非常感谢cvav()给我的帮助,只是我自己太笨,一直搞不好............ 我的目的是用我的SourceFilter取代系统的MPEG-1 Splitter来和下一级的MPEG Video Decodec连接。
就是说,系统的一个播放MPEG1的典型Graph是这样:
File -> MPEG-I Splitter -> Video Decoder -> VideoRender 我想自己做一个MySourceFilter,然后建立这样的Graph:
MySourceFilter -> Video Decoder -> VideoRender 我的思路是将SourceFilter的OutPin设置为和MPEG-1 Splitter的OutPin一样。我就重载了SourceStream的CheckMediaType,GetMediaType。
在CheckMediaType中,如果进来的是Video类型就返回S_OK。
在GetMediaType中,返回类型为MEDIATYPE_Video,MEDIASUBTYPE_MPEG1Packet.
但在GraphEdit中,要将它和MPEG Video Decodec,系统总是说找不到合适的中介过滤器,返回不能连接,错误码0x80040217。把代码贴出来,请各位看看问题在哪:HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt)
{
.......//这边就是确定iPorsition为0或1等例行的操作 switch (iPosition)
{
case 0:
{
pmt->SetType(&MEDIATYPE_Video);
pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Packet );
}
break;
case 1:
{
pmt->SetType(&MEDIATYPE_Video);
pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Payload );
}
break;
} pmt->SetFormatType(&FORMAT_MPEGVideo);
pmt->SetSampleSize(0);
pmt->SetTemporalCompression(FALSE); return NOERROR;
} // GetMediaType 请大家注意我是要做一个连接Decoder的SourceFilter,不是连接Splitter的,所以SDK中Memfile,Async,Ball这些例子都不太适合。像Ball这个例子它直接输出Video数据,处理的方法和我上面写的是大致相同的,可我现在的程序就是调不通。 我想可能还是格式或者Type之类的处理的问题,麻烦高手指点一下,最好说清楚一点或者给个示例代码,多谢了。 请大家指点一下阿,我被卡在这了。给点思路也好,我整整困扰了一周了,问题解决了一定顷囊送分,决不食言。
已经放1000多分了,老板要发飙了,请大家帮忙看看,我会再开贴给分的。决不食言。 另外,非常感谢cvav()给我的帮助,只是我自己太笨,一直搞不好............ 我的目的是用我的SourceFilter取代系统的MPEG-1 Splitter来和下一级的MPEG Video Decodec连接。
就是说,系统的一个播放MPEG1的典型Graph是这样:
File -> MPEG-I Splitter -> Video Decoder -> VideoRender 我想自己做一个MySourceFilter,然后建立这样的Graph:
MySourceFilter -> Video Decoder -> VideoRender 我的思路是将SourceFilter的OutPin设置为和MPEG-1 Splitter的OutPin一样。我就重载了SourceStream的CheckMediaType,GetMediaType。
在CheckMediaType中,如果进来的是Video类型就返回S_OK。
在GetMediaType中,返回类型为MEDIATYPE_Video,MEDIASUBTYPE_MPEG1Packet.
但在GraphEdit中,要将它和MPEG Video Decodec,系统总是说找不到合适的中介过滤器,返回不能连接,错误码0x80040217。把代码贴出来,请各位看看问题在哪:HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt)
{
.......//这边就是确定iPorsition为0或1等例行的操作 switch (iPosition)
{
case 0:
{
pmt->SetType(&MEDIATYPE_Video);
pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Packet );
}
break;
case 1:
{
pmt->SetType(&MEDIATYPE_Video);
pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Payload );
}
break;
} pmt->SetFormatType(&FORMAT_MPEGVideo);
pmt->SetSampleSize(0);
pmt->SetTemporalCompression(FALSE); return NOERROR;
} // GetMediaType 请大家注意我是要做一个连接Decoder的SourceFilter,不是连接Splitter的,所以SDK中Memfile,Async,Ball这些例子都不太适合。像Ball这个例子它直接输出Video数据,处理的方法和我上面写的是大致相同的,可我现在的程序就是调不通。 我想可能还是格式或者Type之类的处理的问题,麻烦高手指点一下,最好说清楚一点或者给个示例代码,多谢了。 请大家指点一下阿,我被卡在这了。给点思路也好,我整整困扰了一周了,问题解决了一定顷囊送分,决不食言。
解决方案 »
- 菜菜送分:取系统环境变量path问题
- 在编译库文件的时候如何同时产生Debug和Release文件夹,并且生成的.lib也要在Release里面?
- fatal error C1010: unexpected end of file while looking for precompiled header directive
- 如何修改256色位图的调色板?
- 关于二维数组的问题?
- 问:如何将LPSTR字符串转换到LPWSTR?!
- 请教CArray的用法
- 如何建立背景为灰色(最好是单文档)且基于Access数据库的应用程序,及如何将位图显示灰色背景窗口中?
- 请问怎么样输入回车换行符?(内详)
- 有谁知道这个问题呀?
- 头疼了一个星期的问题?熟练dll开发和静态lib开发的请进
- 日期的格式?
---------------------------------------------
已经放1000多分了,老板要发飙了
vc十年功,不如卖大葱。---------------------------
这年头,胡说不上税的;你可去呀,为什么还赖在CSDN?
{
CMediaType mtVideo, mtAudio;
mtVideo.majortype = MEDIATYPE_Video;
mtVideo.subtype = MEDIASUBTYPE_MPEG1Payload;
mtVideo.bFixedSizeSamples = FALSE;
mtVideo.bTemporalCompression = TRUE;
mtVideo.lSampleSize = 0;
mtVideo.formattype = FORMAT_MPEGVideo;
mtVideo.pUnk = NULL; BYTE cVideoFormat[108] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2d, 0x19, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x60, 0x01,
0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xd0, 0x07, 0x00, 0x00, 0x5b, 0x20, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc,
0xcc, 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0xb3, 0x16, 0x01, 0x20, 0x83, 0x04, 0x07, 0x60, 0xa4
}; mtVideo.SetFormat(cVideoFormat, 108); mtAudio.majortype = MEDIATYPE_Audio;
mtAudio.subtype = MEDIASUBTYPE_MPEG1AudioPayload;
mtAudio.bFixedSizeSamples = TRUE;
mtAudio.bTemporalCompression = TRUE;
mtAudio.lSampleSize = 0;
mtAudio.formattype = FORMAT_WaveFormatEx;
mtAudio.pUnk = NULL;
BYTE cAudioFormat[40] = {
0x50, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00,
0x36, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16,
0x02, 0x00, 0x80, 0xb5, 0x01, 0x00, 0x01, 0x00,
0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc
};
mtAudio.SetFormat(cAudioFormat, 40); HRESULT hr = S_OK;
m_pEFilter = new CESrcFilter("ESrcFilter", NULL, &mtVideo, &mtAudio, &hr);
if( m_pEFilter == NULL )
return FALSE;
if ( FAILED(hr) )
{
delete m_pEFilter;
return FALSE;
} m_pEFilter->AddRef();
return TRUE;
}
{
HRESULT hr;
ASSERT(m_pIGraphBuilder != NULL); hr = m_pIGraphBuilder->AddFilter(m_pEFilter, L"ESD FILTER");
if ( FAILED(hr) )
return FALSE;
CBasePin* pPinOut = m_pEFilter->GetPin(0);
hr = m_pIGraphBuilder->Render(pPinOut);
pPinOut = m_pEFilter->GetPin(1);
hr = m_pIGraphBuilder->Render(pPinOut);
return TRUE;
}__________
我这样RENDER是成功的.