专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

有关wm asf reader这个filter的有关问题

发布时间:2011-06-27 19:28:45 文章来源:www.iduyao.cn 采编人员:星星草
有关wm asf reader这个filter的问题
老师您好:
  我想请教您一个问题,我在graph manager程序中加入WMAsfReader读入本地的一个asf文件,通过加入的解码filter解码后用Video Render这个filter播放出来,我现在想实现的功能是是播放速率变为原来正常速率的n倍,请问老师该怎么实现,应该用那些接口函数,而且我查了msdn WM Asf Reader这个filter本身也支持一些接口,但是我在程序中也试了一些比如SetRate()函数,但是只要参数不是1.0就会出错,请问老师这是为什么?
  那asf文件使用那些接口函数才能实现播放速率的改变?
我的graph manager中的connect函数如下:
bool DSCompressEngine::Connect()//PVIDEO_FORMAT pVideoFormat)//, PWAVEFORMATEX pWfx)
{
  HRESULT hr; 
hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IFilterGraph, (void**)&m_pifg);
if (FAILED(hr))
return false;
  
  //加入WM Asf Reader这个filter
hr = CoCreateInstance(CLSID_WMAsfReader, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, reinterpret_cast<void**>(&m_pibfSourceStream));
if( FAILED( hr ) )
{
HELPER_RELEASE(m_pibfSourceStream);
//m_pibfSourceStream->release();
//m_pibfSourceStream=NULL;
return false;
}
else
{
hr = m_pifg->AddFilter(m_pibfSourceStream, L"ASF Reader");
if( FAILED( hr ) )
{
return false;
}

  hr=m_pibfSourceStream->QueryInterface(IID_IFileSourceFilter, (void **) &mIFileSource);
mSourceFile="D:\\生成packet\\01.asf";
  //mSourceFile="D:\\生成packet\\3879202.wmv";
BSTR pSource = mSourceFile.AllocSysString();
hr = mIFileSource->Load(pSource, NULL);

}
  //加入AVI Decompressor 这个filter
hr = CoCreateInstance(CLSID_AVIDec, NULL, CLSCTX_INPROC_SERVER, 
IID_IBaseFilter, reinterpret_cast<void**>(&m_pibfTransformCompress)); 
if( FAILED( hr ) )
{
HELPER_RELEASE(m_pibfSourceStream);
HELPER_RELEASE(m_pibfTransformCompress);

return false;
}
  else
{
hr = m_pifg->AddFilter(m_pibfTransformCompress, L"TransformCompress");
if( FAILED( hr ) )
{
return false;
}
}
  //加入Video Render这个filter
hr = CoCreateInstance(CLSID_VideoRendererDefault, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&m_pibfOutputMediaServer));
if( FAILED( hr ) )
{
HELPER_RELEASE(m_pibfSourceStream);
HELPER_RELEASE(m_pibfTransformCompress);
HELPER_RELEASE(m_pibfOutputMediaServer);
return false;
}
else
{
hr = m_pifg->AddFilter(m_pibfOutputMediaServer, L"Output");
if( FAILED( hr ) )
{
return false;
}
}

hr=m_pifg->Connect(GetOutPin(m_pibfSourceStream,1),GetInPin(m_pibfTransformCompress,0));
if (FAILED(hr))
return false;
hr=m_pifg->Connect(GetOutPin(m_pibfTransformCompress,0),GetInPin(m_pibfOutputMediaServer,0));
if (FAILED(hr))
return false;

 
hr=GetOutPin(m_pibfSourceStream,0)->QueryInterface(IID_IMediaSeeking,(void **) &ms);
  hr=ms->SetRate(1.0);//函数的参数只要不是1,hr的返回值就会是负值
  hr=m_pifg->QueryInterface(IID_IMediaPosition,(void **) &mp);
hr=mp->put_Rate(1.0);//函数的参数只要不是1,hr的返回值就会是负值
   
hr=m_pibfSourceStream->QueryInterface(IID_IAMExtendedSeeking,(void **) &ames);

hr=ames->get_PlaybackSpeed(&pSpeed);//&pSpeed的返回值是1.0
hr=ames->put_PlaybackSpeed(1.0);//参数的值也只能是1
  //
hr = WMCreateReader(NULL, WMT_RIGHT_PLAYBACK, &mIReader);
if (FAILED(hr))
{
return FALSE;
}
streamNumber=0;
dwStreams = 0;
hr=mIReader->QueryInterface(IID_IWMReaderAdvanced,(void **)&wmra);

  hr=m_pifg -> QueryInterface(IID_IMediaControl, (void **)&m_pimc);
if (FAILED(hr))
return false;
hr=m_pimc->Run();
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: