📄 capturedlg.cpp
字号:
{
if(i > 500000)
{
gcap.strFileName = ""; //清空播放数据
gcap.InString = ""; //清空读写剪贴板的内容
gcap.PlayerCode = 2; //通知VB重新准备播放文件
SetTimer(1, 2000, NULL); //启动1计时器用于重新检测播放
}
}
}
gcap.mUnGlobal = 0;//解锁读写剪贴板
if (gcap.PlayerCode > 0) WlpGlobal();//写剪贴板
return;
}
}
// 主控制流程-------------------------------------------------------------------------
void CCaptureDlg::OnOK()
{
HRESULT hr = NULL;
if (m_FilterGraph)
{
m_MediaControl->Stop(); //停止播放
AllRelease(); //释放全部应用
}
KillTimer(0); //销毁0定时器
SetTimer(1, 2000, NULL); //启动1计时器
hr = CaptureVideo(); //刷新图表开始新的播放
}
////刷新图表开始新的播放--------------------------------------------------------------
HRESULT CCaptureDlg::CaptureVideo()
{
HRESULT hr = E_FAIL;
IBaseFilter *pSrcFilter = NULL; // Filter
gcap.mUnGlobal = 1;//加锁读写剪贴板
if (SUCCEEDED(hr = GetInterfaces()))// 获得DirectShow中的主要接口
{
if (SUCCEEDED(hr = FindCaptureDevice(&pSrcFilter)))// 确定系统是否安装声卡\枚举音频设备,找到声卡
{
if (SUCCEEDED(hr = AddFilters()))// 添加Filter添加ALL AND 和添加HtAudio filter
{
if (SUCCEEDED(hr = FindFilterPIN()))// 查询Filter接口
{
if (SUCCEEDED(hr = Disconnects()))//断开WAV Filter 与声卡Filter 的连接
{
if (SUCCEEDED(hr = ConnectFilter(m_FilterGraph,NULL, NULL)))//连接WAV Filter -> HtAudio -> 声卡Filter
{
if (SUCCEEDED(hr = SetupVideoWindow(NULL)))// 设置VideoWindow的大小
{
try //执行命令行
{
ResizeVideoWindow(800,0,640,480);
::SetWindowPos(this->m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//保持在最前
if (SUCCEEDED(hr = m_MediaControl->Run()))// 开始显示图像
{
//开始显示图像
return SetNotifyWindow(NULL);
}
//MessageBox("显示图像错误 !");
gcap.mUnGlobal = 0;//解锁读写剪贴板
return hr;
}
catch(...) //异常处理
{
gcap.strFileName = "";//清空变量等待新任务
AllRelease();//释放全部应用
gcap.mUnGlobal = 0;//解锁读写剪贴板
return S_OK;
}
}
//MessageBox("设置视窗错误 !");
}
//MessageBox("新建 HtAudio Filter 连接失败 !");
}
//MessageBox("断开WAV Filter 与声卡Filter 的连接失败 !");
}
//MessageBox("查询Filter接口 失败 !");
//return hr;
}
//MessageBox("添加Filter 失败 !");
//return S_OK;
}
//MessageBox("音频设备(声卡)没有找到 ! ");
}
//MessageBox("获得接口失败 !");
gcap.mUnGlobal = 0;//解锁读写剪贴板
gcap.strFileName = "";//清空变量等待新任务
AllRelease();//释放全部应用
return hr;
}
// 获得DirectShow中的主要接口--------------------------------------------------
HRESULT CCaptureDlg::GetInterfaces()
{
// 创建filter graph 筛选器图表管理器---------------------------------------
if (SUCCEEDED(CoCreateInstance (CLSID_FilterGraph, // 要创建的Filter的Class ID
NULL, // 表示Filter不被聚合
CLSCTX_INPROC, // 创建进程内组件对象
IID_IGraphBuilder, // 创建Filter成功后获得的接口ID
(void **) &m_FilterGraph))) // 生成的接口对象的指针
{
// 创建capture graph builder筛选器图表--------------------------------------
if (SUCCEEDED(CoCreateInstance (CLSID_CaptureGraphBuilder , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder, (void **) &m_pCapture)))
{
// 将筛选器图表filter graph加到capture graph管理器中------------------------
if (SUCCEEDED(m_pCapture->SetFiltergraph(m_FilterGraph)))
{
// 获得VideoWindow接口指针------------------------------------------
if (SUCCEEDED(m_FilterGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_VideoWindow)))
{
// 获得窗口控制接口指针------------------------------------------
if (SUCCEEDED(m_FilterGraph->QueryInterface(IID_IBasicVideo, (LPVOID *) &m_BasicVideo)))
{
// 获得音频接口(音量控制)-----------------------------------------------------
if (SUCCEEDED(m_FilterGraph->QueryInterface(IID_IBasicAudio,(LPVOID *) &m_BasicAudio)))
{
//获得消息传递接口
if (SUCCEEDED(m_FilterGraph->QueryInterface(IID_IMediaEvent, (LPVOID *) &m_MediaEventEx)))
{
// 获得播放控制接口
if (SUCCEEDED(m_FilterGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &m_MediaControl)))
{
// 获得播放进度速度接口
if (SUCCEEDED(m_FilterGraph->QueryInterface(IID_IMediaSeeking,(LPVOID *) &m_MediaSeeking)))
{
return S_OK;
}
//MessageBox("获得播放进度速度接口失败 !");
}
//MessageBox("获得播放控制接口失败 !");
}
//MessageBox("获得消息传递接口失败 !");
}
//MessageBox("获得音频接口(音量控制)失败 !");
}
//MessageBox("获得窗口控制接口失败 !");
}
//MessageBox("获得获得VideoWindow接口失败 !");
}
//MessageBox("加入Filter Graph失败 !");
}
//MessageBox("创建capture graph builder 筛选器图表失败 !");
}
//MessageBox("创建filter graph 筛选器图表管理器失败 !");
return E_FAIL;
}
// end
// 查询Filter接口--------------------------------------------------------------
HRESULT CCaptureDlg::FindFilterPIN()
{
//查找声卡Filter 获得地址->指针->接口--------------------------------------
if (SUCCEEDED(FindAudioModes()))
{
//查找声道HtAudio Filter 获得地址->指针->接口-----------------------------
if (SUCCEEDED(FindMPEGProps()))
{
//查找解码器WMA Filter 获得地址->指针->接口-----------------------------
CString last;
if (gcap.strFileName != "")
{
last = gcap.strFileName.Right(3);//取文件最后三字节
if (last == "wmv" || last == "WMV")
{
if (SUCCEEDED(FindWMAFilter())) return S_OK;
}
if (last == "avi" || last == "AVI")
{
if (SUCCEEDED(FindAVIFilter())) return S_OK;
}
if (last == "dat" || last == "DAT")
{
if (SUCCEEDED(FindDATFilter())) return S_OK;
}
if (last == "mvb" || last == "MVB")
{
if (SUCCEEDED(FindRMVBFilter())) return S_OK;
}
if (last == "mpg" || last == "MPG")
{
if (SUCCEEDED(FindDATFilter())) return S_OK;
}
if (last == "vob" || last == "VOB")
{
if (SUCCEEDED(FindVOBFilter())) return S_OK;
}
//MessageBox("没有找到解码器 Filter !");
}
}
//MessageBox("没有找到声道HtAudio Filter !");
}
//MessageBox("没有找到声卡Filter !");
return E_FAIL;
}
//获取播放文件名------------------------------------------------------------------
HRESULT CCaptureDlg::FoundPlayerFilts()
{
if (gcap.waitFileName != "")//播放已选歌曲
{
AutoPlayerFilts();//查找播放文件是否存在
if (gcap.FileTypeMunber == 0) //未找到
{
gcap.waitFileName = "";
}
else
{
gcap.strFileName = gcap.waitFileName;
gcap.waitFileName = "";
}
}
gcap.PlayerCode = 2;//通知VB准备播放文件
WlpGlobal();//改写剪贴板
return S_OK;
}
//查找播放文件模块-----------------------------------------------------------------
HRESULT CCaptureDlg::AutoPlayerFilts()
{
char* charFileName;
WIN32_FIND_DATA FindFileData;//查找文件时要使用的数据结构
HANDLE hFind = INVALID_HANDLE_VALUE;//定义查找句柄
charFileName = (char*)(LPCTSTR)gcap.waitFileName;
hFind = FindFirstFile(charFileName, &FindFileData);//使用FindFirstFile函数来判断文件是否存在
FindClose(hFind);//关闭查找句柄
gcap.FileTypeMunber = 0; //查找文件未找到=0找到=1
if (hFind == INVALID_HANDLE_VALUE)
{
gcap.FileTypeMunber = 0;//未找到=0
return (-1);
}
else
{
gcap.FileTypeMunber = 1;//找到=1
return S_OK;
}
}
//添加ALL AND 和添加HtAudio filter------------------------------------------------
HRESULT CCaptureDlg::AddFilters()
{
char* charFileName;
WCHAR szFilePath[MAX_PATH];
charFileName = (char*)(LPCTSTR)gcap.strFileName;
MultiByteToWideChar(CP_ACP, 0, charFileName, -1, szFilePath, MAX_PATH);
try
{
if (SUCCEEDED(m_FilterGraph->RenderFile(szFilePath, NULL)))//利用文件名创建图表
{
// 用clsid添加HtAudio Filter------------------------------------
if (SUCCEEDED(CoCreateInstance(CLSID_HtAudio, 0,
CLSCTX_INPROC_SERVER,
IID_IBaseFilter,
reinterpret_cast<void **>(&gcap.iHtAudioRightFilterclsid))))
{
if (SUCCEEDED(m_FilterGraph->AddFilter(gcap.iHtAudioRightFilterclsid, L"HtAudio Filters")))
{
return S_OK;
}
//MessageBox("添加 HtAudio Filter 失败 ! ");
}
//MessageBox("查找 HtAudio Filter 失败 ! ");
}
}
catch(...) //异常处理
{
for(int i = 0 ; i < 800002 ; i++) //缓冲
{
if(i > 800000)
{
gcap.strFileName = "";
AllRelease(); //释放全部应用
gcap.PlayerCode = 1;
//MessageBox("创建图表失败 ! ");
}
}
}
return S_OK;
}
//解码器WMA Filter 获得地址->指针->接口----------------------------------------------------
HRESULT CCaptureDlg::FindWMAFilter()
{
IBaseFilter *pAudioMode = NULL;
ISpecifyPropertyPages *pAudioModes = NULL;
//按文件名获得解码器WMA Filter地址
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"WMAudio Decoder DMO", &pAudioMode)))//HtAudio
{
//获得解码器WMA Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iWMAFilterID)))
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//查找解码器WMA Filter接口
{
return S_OK;
}
}
}
return E_FAIL;
}
//解码器AVI Filter 获得地址->指针->接口----------------------------------------------------
HRESULT CCaptureDlg::FindAVIFilter()
{
IBaseFilter *pAudioMode = NULL;
ISpecifyPropertyPages *pAudioModes = NULL;
//按文件名获得解码器AVI Filter地址
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"MPEG Layer-3 Decoder", &pAudioMode)))//HtAudio
{
//获得解码器AVI Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iWMAFilterID)))
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//查找解码器AVI Filter接口
{
return S_OK;
}
}
}
return E_FAIL;
}
//解码器DAT Filter 获得地址->指针->接口----------------------------------------------------
HRESULT CCaptureDlg::FindDATFilter()
{
IBaseFilter *pAudioMode = NULL;
ISpecifyPropertyPages *pAudioModes = NULL;
//按文件名获得解码器DAT Filter地址
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"MPEG Audio Decoder", &pAudioMode)))//HtAudio
{
//获得解码器DAT Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iWMAFilterID)))
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//查找解码器DAT Filter接口
{
return S_OK;
}
}
}
return E_FAIL;
}
//解码器FLV Filter 获得地址->指针->接口----------------------------------------------------
HRESULT CCaptureDlg::FindVOBFilter()
{
IBaseFilter *pAudioMode = NULL;
ISpecifyPropertyPages *pAudioModes = NULL;
//按文件名获得解码器FLV Filter地址
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"CyberLink Audio Decoder", &pAudioMode)))//HtAudio
{
//获得解码器FLV Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iWMAFilterID)))
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//查找解码器VOB Filter接口
{
return S_OK;
}
//MessageBox("查找解码器FLV Filter接口 失败 ! ");
}
//MessageBox("获得解码器FLV Filter指针 失败 ! ");
}
//MessageBox("按文件名获得解码器FLV Filter地址 失败 ! " + gcap.strFileName);
return E_FAIL;
}
//解码器RMVB Filter 获得地址->指针->接口----------------------------------------------------
HRESULT CCaptureDlg::FindRMVBFilter()
{
IBaseFilter *pAudioMode = NULL;
ISpecifyPropertyPages *pAudioModes = NULL;
//按文件名获得解码器DAT Filter地址
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"RealAudio Decoder", &pAudioMode)))//HtAudio
{
//获得解码器DAT Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iWMAFilterID)))
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//查找解码器DAT Filter接口
{
return S_OK;
}
}
return E_FAIL;
}
else
{
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"CoreAAC Audio Decoder", &pAudioMode)))
{
//获得解码器DAT Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iWMAFilterID)))
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//查找解码器DAT Filter接口
{
return S_OK;
}
}
}
}
return E_FAIL;
}
//获得声道HtAudio Filter地址->指针->接口---------------------------------------------
HRESULT CCaptureDlg::FindMPEGProps()
{
IBaseFilter *pAudioMode = NULL;
ISpecifyPropertyPages *pAudioModes = NULL;
//按文件名获得声道Filter地址
if (SUCCEEDED(m_FilterGraph->FindFilterByName(L"HtAudio Filters", &pAudioMode)))//HtAudio
{
//获得声道Filter指针
IBaseFilter *m_pACouts = NULL;
if (SUCCEEDED(pAudioMode->QueryInterface(IID_IBaseFilter, (void**)&gcap.iHtAudioRightFilterID)))
{
gcap.iHtAudioFilterID = gcap.iHtAudioRightFilterID;
//查找声道 Filter接口
if (SUCCEEDED(FindHtAudioFilterInOutPIN()))
{
return S_OK;
}
}
//MessageBox("没有HtAudio Filter指针 ! ");
}
return E_FAIL;
}
//枚举接口共用函数----------------------------------------------------------------
HRESULT CCaptureDlg::GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
IEnumPins *pEnum;
IPin *pPin;
pFilter->EnumPins(&pEnum);
while(pEnum->Next(1, &pPin, 0) == S_OK)
{
PIN_DIRECTION PinDirThis;
pPin->QueryDirection(&PinDirThis);
if (PinDir == PinDirThis)
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
pPin->Release();
}
pEnum->Release();
return E_FAIL;
}
//选择声道重载连接Filter----------------------------------------------------------------------------
HRESULT CCaptureDlg::ConnectFilter(IGraphBuilder *pGraph, IBaseFilter *pFirst, IBaseFilter *pSecond)
{
if (SUCCEEDED(FindWMAFilterInOutPIN()))//重载解码器
{
if (SUCCEEDED(FindHtAudioFilterInOutPIN()))//重载声道
{
if (SUCCEEDED(FindAudioFilterInPIN()))//重载声卡
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -