我照着http://blog.csdn.net/liguisen/archive/2008/03/16/2186994.aspx依样画葫芦,做了个简单的播放器。
然后再网上下载了一些视频作为测试。
经测试,只有一些很简单的avi格式的视频可以播放(简单的小片段,不超过20S播放时间),其他的文件都不能播放,现象为:正常情况下,打开文件后,显示画面的第一帧,但现在都是没有显示图像。开始播放,有些视频有在播放(没图像,但是进度条在走),有些视频无法播放(播放进度条没动)。
两种情况分开跟踪调试,播放进度条没动的情况下,跟踪调试发现,CreateGraph里的mFilterGraph->Create()返回TRUE,但是 mFilterGraph->RenderFile(mSourceFile);返回FALSE,也就是说问题出在读取文件的时候。
IGraphBuilder* mGraph;
bool CDXGraph::RenderFile(CString inFile)
{
if (mGraph)
{
if (SUCCEEDED(mGraph->RenderFile(inFile, NULL)))
{
return true;
}
}
return false;
}
mGraph->RenderFile(inFile, NULL)执行失败,IGraphBuilder是dx提供的类,执行到这里就不知道要如何分析了。。另外一种情况(播放进度条有动,但是没有图像)
CreateGraph和RenderFile都return true;
mFilterGraph->Run();也return true;用暴风影音播放这些视频都能正常播放的,因此应该不是解码器的问题。
请教各位这个问题有什么思路没有。

解决方案 »

  1.   

    补充一点:
    在视频进度条有动,但是没有图像的情况下,调用SetFullScreen发现不能全屏
    bool CDXGraph::SetFullScreen(BOOL inEnabled)
    {
    if (mVideoWindow)
    {
    HRESULT hr = mVideoWindow->put_FullScreenMode(inEnabled ? OATRUE : OAFALSE);
    return SUCCEEDED(hr);
    }
    return false;
    }
      

  2.   

    应该是解码器的问题, 暴风影音可以放,和你的程序没关系,
    主要看操作系统是否支持, win7现在免费支持很多格式了,
      

  3.   

    暴风影音可不是简单的程序,起码会针对不同的文件选择解码器。
    RenderFile是交给系统自己匹配解码器。可能有的解码器不合适。
      

  4.   

    应该是解码器的问题, 暴风影音可以放,和你的程序没关系,
    主要看操作系统是否支持, win7现在免费支持很多格式了, 
     
      

  5.   

    暴风影音是自带解码器的,但没有注册到系统,他自己是动态加载的,所以他的解码器你不注册的话是用不了的。你readerfile失败那应该就是缺解码器。你可以用grahpedt看下。
      

  6.   


    其他文件不能播放可能是解码器问题。只有声音没有图像,说明文件中的视频流没有对应解码器,音频流有解码器。
    能不能全屏,最好查一下MSDN关于IVideoWindow的描述,可能会有帮助吧。
      

  7.   

    使用graphedit.exe确认过了 是解码器的问题。
    感谢各位的大力帮助。
    我现在需要在视频上做透明滚动字幕
    想移植下陆其明的FilterTitleOverlay。直接编译陆其明的源码,提示注册Filter返回错误。
    并且我不清楚要如何调用一个注册过的Filter
    所以我想直接将FilterTitleOverlay的源码包含到我的播放器程序里。我做的主要工作是将注册信息去掉,并且删除
    STDAPI DllRegisterServer()
    {
    return AMovieDllRegisterServer2( TRUE );
    }STDAPI DllUnregisterServer()
    {
    return AMovieDllRegisterServer2( FALSE );
    }
    这两个注册函数。但会有以下错误:
    1>strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
    1>strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 "int g_cTemplates" (?g_cTemplates@@3HA)我知道是错误是因为在程序中调用了dllentry.cpp,而我将源码中定义的g_Templates和g_cTemplates去掉的缘故,我不需要将这个Filter封装成DLL再来调用,所以我不用调用dllentry.cpp,但是我在陆的源码中没有找到相关的代码,后来我将CTitleOverlayProp.cpp的所有源码注释掉,才能编译通过。但这样肯定是不正常的,请问这里要如何处理。。编译通过后又遇到了新的问题:
    执行生成的exe文件MyPlayer.exe的时候,不能正常打开,会弹出一个对话框,提示错误信息:
    无法启动程序MyPlayer.exe由于应用程序配置不正确,未能启动此应用程序。请查看清单文件以查找可能的错误。
    我完全傻眼了,搞了两天搞了这么个结果。。请教各位DX高手帮帮忙啊,字幕的问题纠结了我很久了。。
    如果有别的高效的透明滚动字幕的方法,也请不吝赐教
      

  8.   

    使用graphedit.exe确认过了 是解码器的问题。
    感谢各位的大力帮助。
    我现在需要在视频上做透明滚动字幕
    想移植下陆其明的FilterTitleOverlay。直接编译陆其明的源码,提示注册Filter返回错误。
    并且我不清楚要如何调用一个注册过的Filter
    所以我想直接将FilterTitleOverlay的源码包含到我的播放器程序里。我做的主要工作是将注册信息去掉,并且删除
    STDAPI DllRegisterServer()
    {
    return AMovieDllRegisterServer2( TRUE );
    }STDAPI DllUnregisterServer()
    {
    return AMovieDllRegisterServer2( FALSE );
    }
    这两个注册函数。但会有以下错误:
    1>strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
    1>strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 "int g_cTemplates" (?g_cTemplates@@3HA)我知道是错误是因为在程序中调用了dllentry.cpp,而我将源码中定义的g_Templates和g_cTemplates去掉的缘故,我不需要将这个Filter封装成DLL再来调用,所以我不用调用dllentry.cpp,但是我在陆的源码中没有找到相关的代码,后来我将CTitleOverlayProp.cpp的所有源码注释掉,才能编译通过。但这样肯定是不正常的,请问这里要如何处理。。编译通过后又遇到了新的问题:
    执行生成的exe文件MyPlayer.exe的时候,不能正常打开,会弹出一个对话框,提示错误信息:
    无法启动程序MyPlayer.exe由于应用程序配置不正确,未能启动此应用程序。请查看清单文件以查找可能的错误。
    我完全傻眼了,搞了两天搞了这么个结果。。请教各位DX高手帮帮忙啊,字幕的问题纠结了我很久了。。
    如果有别的高效的透明滚动字幕的方法,也请不吝赐教
      

  9.   

        可以在debug模式下F5运行一下,看看能不能找到错误。
        其实字幕可以使用VMR9来实现,我从前用过(虽然没做滚动效果),很方便的。可以查一下MSDN,字体、颜色都可以设置。如果想实现滚动效果,可以设置定时器,定期改变矩形位置。在DirectShow的示例里好像有一个VMR9的例子,试一下吧,会成功的。