⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 capturedlg.cpp

📁 昊天vod点播810版核心程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			{
				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 + -