用DirectShow编写的视频播放只有.avi,wmv有声音,
其它格式有图像无声音;
请教下是什么问题?
最好给些资料参考一下,就是用DirectShow播放本地视频文件。。。。
谢谢!
17 个解决方案
#1
m没人做过这方面的??
#2
我还没做过。。。
#3
avi文件的话,看看audio头,看看编码格式是什么
#4
现在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
能否给点资料或例子。。。我查了好久搞不懂
#13
ffmpeg来解析 是在程序里怎么用?是下载ffmpeg。然后在程序里使用ffmpeg吗?
#14
能否给个解码器解码的例子
#15
帮顶一下
#16
你的邮箱多少?
#17
怎样调用解码器,我现在也有同样的问题,求解。
#1
m没人做过这方面的??
#2
我还没做过。。。
#3
avi文件的话,看看audio头,看看编码格式是什么
#4
现在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
能否给点资料或例子。。。我查了好久搞不懂
#13
ffmpeg来解析 是在程序里怎么用?是下载ffmpeg。然后在程序里使用ffmpeg吗?
#14
能否给个解码器解码的例子
#15
帮顶一下
#16
你的邮箱多少?
#17
怎样调用解码器,我现在也有同样的问题,求解。