用DirectShow编写的视频播放只有.avi,wmv有声音,其它格式有图像无声音

时间:2023-01-21 19:58:19


用DirectShow编写的视频播放只有.avi,wmv有声音,
其它格式有图像无声音;

请教下是什么问题?
最好给些资料参考一下,就是用DirectShow播放本地视频文件。。。。


谢谢!

17 个解决方案

#1


用DirectShow编写的视频播放只有.avi,wmv有声音,其它格式有图像无声音m没人做过这方面的??

#2


我还没做过。。。

#3


avi文件的话,看看audio头,看看编码格式是什么

#4


引用 3 楼 ouyh12345 的回复:
avi文件的话,看看audio头,看看编码格式是什么

现在wmv,avi格式的视频没有问题。就是其他的格式如:mpg4,rmvb这些就不行。

#5


音频的编码格式 是否都支持?或者看看支持的avi音频格式是什么,然后再合成这样的mp4出来看看撒

#6


总之要获取audio头,然后调用相应的解码器

#7


还是搞不出来。。。就是没有声音啊,,,能否给点播放Mp4,MP3,Rmvb的资料或源码例子,,,谢谢

#8


头文件:
#include <streams.h>
#include <d3d9.h>
#include <vmr9.h>
#include <mmsystem.h>


IGraphBuilder* m_pG;
ICaptureGraphBuilder2 *m_pC;
IMediaControl* m_pM;
IMediaEventEx* m_pE;
IVideoWindow* m_pWin;
IAMDroppedFrames* m_pDF;
IMediaPosition* m_pP;
IBaseFilter *m_pBF;
IBasicVideo *m_pBV;    //设置视频特性,如显示的目的区域和源区域
    IBasicAudio *m_pBA;    //设置音频流的大小和平衡
IMediaSeeking * m_pSeeking;

#9


CPP文件:
HRESULT Cvp::OpenFile(CString szFile)
{
if(m_status != isStop) Stop();
HRESULT hr;
if (FAILED(QueryInterface())) AfxMessageBox(_T("GetInterfaces failed."));
m_pG->QueryInterface(IID_IMediaPosition, (void **)&m_pP);
m_pBA->put_Volume(100);  
hr = m_pG->RenderFile(szFile,NULL);
if(SUCCEEDED(hr)) hr = m_pP->get_Duration(&m_tLength);
m_status = isPlayfile;
return hr;
}


void Cvp::SetDisplayWindow(HWND InputHWnd)
{
    m_myHWnd = InputHWnd;
    if (m_pG)
    {
        HRESULT hr = m_pG->QueryInterface(IID_IVideoWindow, (void **)&m_pWin);
        if (m_pWin != NULL)
        {
            m_pWin->put_Visible(OAFALSE);
            m_pWin->put_Owner((OAHWND)InputHWnd);

            RECT windowRect;
            ::GetClientRect(InputHWnd, &windowRect);
            m_pWin->put_Left(0);
            m_pWin->put_Top(0);
            m_pWin->put_Width(windowRect.right - windowRect.left);
            m_pWin->put_Height(windowRect.bottom - windowRect.top);
            m_pWin->put_WindowStyle(WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
            m_pWin->put_MessageDrain((OAHWND) InputHWnd);

            if (InputHWnd != NULL)
            {
                m_pWin->put_Visible(OATRUE);
            }
            else
            {
                m_pWin->put_Visible(OAFALSE);
            }
m_pM->Run();
        }
    }
}

bool Cvp::SetNotifyWindow(HWND inWindow)
{
    if (m_pE)
    {
        m_pE->SetNotifyWindow((OAHWND)inWindow, WM_GRAPHNOTIFY, 0);
        return true;
    }
    return false;
}

bool Cvp::QueryInterface()
{
    if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pG)))
    {
        HRESULT hr = NOERROR;
        hr |= m_pG->QueryInterface(IID_IMediaControl, (void **)&m_pM);
        hr |= m_pG->QueryInterface(IID_IMediaEventEx, (void **)&m_pE);      
        hr |= m_pG->QueryInterface(IID_IVideoWindow, (void **)&m_pWin);
hr |= m_pG->QueryInterface(IID_IBasicVideo, (void **)&m_pBV);        
        hr |= m_pG->QueryInterface(IID_IBasicAudio, (void **)&m_pBA);
hr |= m_pG->QueryInterface(IID_IMediaSeeking, (void **)&m_pSeeking);
        if (!SUCCEEDED(hr))
        {
            return false;
        }
        return true;
    }
    return false;
}

void Cvp::Play()
{
if(m_status != isPause ) return;
HRESULT hr;
hr = m_pP->get_CurrentPosition(&m_tCurrent);
if(SUCCEEDED(hr))
{
if((m_tRemain = m_tLength-m_tCurrent)<1) m_pP->put_CurrentPosition(0);
else m_pP->put_CurrentPosition(m_tCurrent);
}
if(m_pM) m_pM->Run();
m_status = isPlayfile;
}

void Cvp::Pause()
{
if(m_status == isPause) return;
if(m_pM) m_pM->Pause();
m_status=isPause;
}

void Cvp::Stop()
{
if(m_status == isStop) return;
if(m_pM) m_pM->Stop();
if(m_pWin)
{
m_pWin->put_Visible(OAFALSE);
m_pWin->put_Owner(NULL);
}
HELPER_RELEASE(m_pWin);
HELPER_RELEASE(m_pM);
HELPER_RELEASE(m_pG);
HELPER_RELEASE(m_pC);
HELPER_RELEASE(m_pBV);
HELPER_RELEASE(m_pBA);
HELPER_RELEASE(m_pBF);
HELPER_RELEASE(m_pE);
HELPER_RELEASE(m_pDF);
HELPER_RELEASE(m_pSeeking);
m_status=isStop;
}

bool Cvp::FullScreen()
{
if (m_pWin)
{
  long  fullScreenMode = OAFALSE;
  m_pWin->put_FullScreenMode(OATRUE);
  return (fullScreenMode == OATRUE);
 }
 return false;
}




那个高手帮忙看看啊,实在不知道怎么回事??

#10


友情帮顶!!!

#11


没有mp3,mp4的硬件解码器,需要自己写程序来解析的,以前我用ffmpeg来解析的,而且暴风影音也是用ffmpeg来解析的,你查查相关资料吧。

#12


引用 11 楼 yangnix 的回复:
没有mp3,mp4的硬件解码器,需要自己写程序来解析的,以前我用ffmpeg来解析的,而且暴风影音也是用ffmpeg来解析的,你查查相关资料吧。


能否给点资料或例子。。。我查了好久搞不懂

#13


ffmpeg来解析  是在程序里怎么用?是下载ffmpeg。然后在程序里使用ffmpeg吗?

#14


引用 11 楼 yangnix 的回复:
没有mp3,mp4的硬件解码器,需要自己写程序来解析的,以前我用ffmpeg来解析的,而且暴风影音也是用ffmpeg来解析的,你查查相关资料吧。

能否给个解码器解码的例子

#15


帮顶一下

#16


你的邮箱多少?

#17


怎样调用解码器,我现在也有同样的问题,求解。
引用 6 楼 ouyh12345 的回复:
总之要获取audio头,然后调用相应的解码器

#1


用DirectShow编写的视频播放只有.avi,wmv有声音,其它格式有图像无声音m没人做过这方面的??

#2


我还没做过。。。

#3


avi文件的话,看看audio头,看看编码格式是什么

#4


引用 3 楼 ouyh12345 的回复:
avi文件的话,看看audio头,看看编码格式是什么

现在wmv,avi格式的视频没有问题。就是其他的格式如:mpg4,rmvb这些就不行。

#5


音频的编码格式 是否都支持?或者看看支持的avi音频格式是什么,然后再合成这样的mp4出来看看撒

#6


总之要获取audio头,然后调用相应的解码器

#7


还是搞不出来。。。就是没有声音啊,,,能否给点播放Mp4,MP3,Rmvb的资料或源码例子,,,谢谢

#8


头文件:
#include <streams.h>
#include <d3d9.h>
#include <vmr9.h>
#include <mmsystem.h>


IGraphBuilder* m_pG;
ICaptureGraphBuilder2 *m_pC;
IMediaControl* m_pM;
IMediaEventEx* m_pE;
IVideoWindow* m_pWin;
IAMDroppedFrames* m_pDF;
IMediaPosition* m_pP;
IBaseFilter *m_pBF;
IBasicVideo *m_pBV;    //设置视频特性,如显示的目的区域和源区域
    IBasicAudio *m_pBA;    //设置音频流的大小和平衡
IMediaSeeking * m_pSeeking;

#9


CPP文件:
HRESULT Cvp::OpenFile(CString szFile)
{
if(m_status != isStop) Stop();
HRESULT hr;
if (FAILED(QueryInterface())) AfxMessageBox(_T("GetInterfaces failed."));
m_pG->QueryInterface(IID_IMediaPosition, (void **)&m_pP);
m_pBA->put_Volume(100);  
hr = m_pG->RenderFile(szFile,NULL);
if(SUCCEEDED(hr)) hr = m_pP->get_Duration(&m_tLength);
m_status = isPlayfile;
return hr;
}


void Cvp::SetDisplayWindow(HWND InputHWnd)
{
    m_myHWnd = InputHWnd;
    if (m_pG)
    {
        HRESULT hr = m_pG->QueryInterface(IID_IVideoWindow, (void **)&m_pWin);
        if (m_pWin != NULL)
        {
            m_pWin->put_Visible(OAFALSE);
            m_pWin->put_Owner((OAHWND)InputHWnd);

            RECT windowRect;
            ::GetClientRect(InputHWnd, &windowRect);
            m_pWin->put_Left(0);
            m_pWin->put_Top(0);
            m_pWin->put_Width(windowRect.right - windowRect.left);
            m_pWin->put_Height(windowRect.bottom - windowRect.top);
            m_pWin->put_WindowStyle(WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
            m_pWin->put_MessageDrain((OAHWND) InputHWnd);

            if (InputHWnd != NULL)
            {
                m_pWin->put_Visible(OATRUE);
            }
            else
            {
                m_pWin->put_Visible(OAFALSE);
            }
m_pM->Run();
        }
    }
}

bool Cvp::SetNotifyWindow(HWND inWindow)
{
    if (m_pE)
    {
        m_pE->SetNotifyWindow((OAHWND)inWindow, WM_GRAPHNOTIFY, 0);
        return true;
    }
    return false;
}

bool Cvp::QueryInterface()
{
    if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pG)))
    {
        HRESULT hr = NOERROR;
        hr |= m_pG->QueryInterface(IID_IMediaControl, (void **)&m_pM);
        hr |= m_pG->QueryInterface(IID_IMediaEventEx, (void **)&m_pE);      
        hr |= m_pG->QueryInterface(IID_IVideoWindow, (void **)&m_pWin);
hr |= m_pG->QueryInterface(IID_IBasicVideo, (void **)&m_pBV);        
        hr |= m_pG->QueryInterface(IID_IBasicAudio, (void **)&m_pBA);
hr |= m_pG->QueryInterface(IID_IMediaSeeking, (void **)&m_pSeeking);
        if (!SUCCEEDED(hr))
        {
            return false;
        }
        return true;
    }
    return false;
}

void Cvp::Play()
{
if(m_status != isPause ) return;
HRESULT hr;
hr = m_pP->get_CurrentPosition(&m_tCurrent);
if(SUCCEEDED(hr))
{
if((m_tRemain = m_tLength-m_tCurrent)<1) m_pP->put_CurrentPosition(0);
else m_pP->put_CurrentPosition(m_tCurrent);
}
if(m_pM) m_pM->Run();
m_status = isPlayfile;
}

void Cvp::Pause()
{
if(m_status == isPause) return;
if(m_pM) m_pM->Pause();
m_status=isPause;
}

void Cvp::Stop()
{
if(m_status == isStop) return;
if(m_pM) m_pM->Stop();
if(m_pWin)
{
m_pWin->put_Visible(OAFALSE);
m_pWin->put_Owner(NULL);
}
HELPER_RELEASE(m_pWin);
HELPER_RELEASE(m_pM);
HELPER_RELEASE(m_pG);
HELPER_RELEASE(m_pC);
HELPER_RELEASE(m_pBV);
HELPER_RELEASE(m_pBA);
HELPER_RELEASE(m_pBF);
HELPER_RELEASE(m_pE);
HELPER_RELEASE(m_pDF);
HELPER_RELEASE(m_pSeeking);
m_status=isStop;
}

bool Cvp::FullScreen()
{
if (m_pWin)
{
  long  fullScreenMode = OAFALSE;
  m_pWin->put_FullScreenMode(OATRUE);
  return (fullScreenMode == OATRUE);
 }
 return false;
}




那个高手帮忙看看啊,实在不知道怎么回事??

#10


友情帮顶!!!

#11


没有mp3,mp4的硬件解码器,需要自己写程序来解析的,以前我用ffmpeg来解析的,而且暴风影音也是用ffmpeg来解析的,你查查相关资料吧。

#12


引用 11 楼 yangnix 的回复:
没有mp3,mp4的硬件解码器,需要自己写程序来解析的,以前我用ffmpeg来解析的,而且暴风影音也是用ffmpeg来解析的,你查查相关资料吧。


能否给点资料或例子。。。我查了好久搞不懂

#13


ffmpeg来解析  是在程序里怎么用?是下载ffmpeg。然后在程序里使用ffmpeg吗?

#14


引用 11 楼 yangnix 的回复:
没有mp3,mp4的硬件解码器,需要自己写程序来解析的,以前我用ffmpeg来解析的,而且暴风影音也是用ffmpeg来解析的,你查查相关资料吧。

能否给个解码器解码的例子

#15


帮顶一下

#16


你的邮箱多少?

#17


怎样调用解码器,我现在也有同样的问题,求解。
引用 6 楼 ouyh12345 的回复:
总之要获取audio头,然后调用相应的解码器