我在做一个video播放器,发现声音和图像不同步。具体情况:1、创建IGraphBuilder实例m_Gb;
2、Render视频文件。
3、创建IMediaControl实例m_Mc。
4、创建IMediaEventEx实例m_Me。
5、创建IMediaSeeking实例m_Ms。
6、创建IMediaPosition实例m_Mp。
7、创建IVideoWindow实例m_Vw。
8、创建IBasicVideo实例m_Bv.
9、创建IBasicAudio实例m_Ba。
10、链接视频窗口及消息。
    m_Vw->put_Owner(OAHWND)hWnd);
    m_Vw->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN))) )
    m_Vw->put_MessageDrain((OAHWND)hWnd))) 
    m_Me->SetNotifyWindow((OAHWND)hWnd,WM_GRAPHNOTIFY,0))) 
11、设置视频大小。
    m_m_Vw->SetWindowPosition(x,y,nWidth,nHeight)
12、开始播放视频
    m_Mc->Run();
按照以上的做法,我发现视频先快进一段,没有声音。然后视频卡住,开始播声音,等到了与视频同步的点,视频和声音就能同步上了。
后来我把m_Mc->Run();拿掉,上面的code运行的现象:视频先快进一段,没有声音,然后视频就停住了。  我没有Run,为什么会先播放一段没有声音的一段?那位xdjm对这个问题有解,请赐教,先谢谢~~~~

解决方案 »

  1.   

    音视频同步的问题。
    如果播放的是文件,可以用GraphEdit播放验证一下,
    如果是网络码流,确认时间戳是否正确。
      

  2.   


    谢谢您的回复。播放的是WMV文件,而且用GraphEdit播放是ok的。
    就是自己写的code有问题。
    主要是没有run的时候,文件就会被播放。不知道这个是什么原因?
      

  3.   

    印象中好象有RenderFile,RenderStream之类的函数,试一下.
      

  4.   


    上面写的第二步就是用RenderFile来Render wmv文件的。
      

  5.   

    DSHOW好久不用了,RenderFile后还需要调Run吗?
      

  6.   


    呵呵,谢谢你。
    是的,RenderFile只是构建filter来分离和解析视频流和音频流。
      

  7.   

    那你仔细研究一下Dshow的文档,看看调用顺序有没有问题,有没有缺少什么语句.
      

  8.   

    不知道其他xdjm有啥建议没有?
      

  9.   

    没什么好说的,不可能没Run就自动播放了,肯定是代码有问题可以的话直接贴代码
      

  10.   


    谢谢回复~
    代码比较多,不好上传啊。dshow部分的基本流程在上面。只不过加了些界面和定时器什么的。
    不知道有没有什么操作会造成这个现象。
    总的感觉是audio部分ok,就是video的部分不正常。
      

  11.   

    看你的流程,就是一个最简单的链路,这样看不出问题用文档里的How To Play a File试试呢说到不用Run就自动播,这有点颠覆我的世界观