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

📄 serverdlg.cpp

📁 采用DirecShow通过网络传输实现远程视频动态播放,
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
			IID_IGraphBuilder, (void **)&mGraph)))
		{
			mGraph->QueryInterface(IID_IMediaControl, (void **)&mMediaControl);
			mGraph->QueryInterface(IID_IMediaSeeking, (void **)&mSeeking);
			return TRUE;
		}
		mGraph = NULL;
	}
	return FALSE;

}

BOOL CServerDlg::AfterBuildGraph()
{
	SOCKET videosocket=mVideo.GetSocket();
	if(videosocket!=INVALID_SOCKET)
	{
		mVideoSender->SetStreamSocket(videosocket);
	}
	else
	{
		return FALSE;
		MessageBox("video socket fail");
	}
	
	SOCKET audiosocket=mAudio.GetSocket();
	if(audiosocket!=INVALID_SOCKET)
	{
		mAudioSender->SetStreamSocket(audiosocket);
	}
	else
	{
		return FALSE;
		MessageBox("audio socket fail");
	}
	

	SetDisplayWindow(mVideoWnd.m_hWnd);

	if (SUCCEEDED(mMediaControl->Run()))
	{
		mSliderTimer=SetTimer(1,2000,NULL);
		mState=PLAY;
		return TRUE;

	}

	return FALSE;
}

BOOL CServerDlg::SetDisplayWindow(HWND inWindow)
{	
	HRESULT hr = NOERROR;
	IVideoWindow  *		mVideoWindow;
	hr = mGraph->QueryInterface(IID_IVideoWindow, (void **)&mVideoWindow);
	if (mVideoWindow)
	{
		mVideoWindow->put_Visible(OAFALSE);
		mVideoWindow->put_Owner((OAHWND)inWindow);
		RECT windowRect;
		::GetClientRect(inWindow, &windowRect);
		mVideoWindow->put_Left(0);
		mVideoWindow->put_Top(0);
		mVideoWindow->put_Width(windowRect.right - windowRect.left);
		mVideoWindow->put_Height(windowRect.bottom - windowRect.top);
		mVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
		mVideoWindow->put_MessageDrain((OAHWND) inWindow);
		if (inWindow != NULL)
		{
			mVideoWindow->put_Visible(OATRUE);
		}
		else
		{
			mVideoWindow->put_Visible(OAFALSE);
		}
		mVideoWindow->Release();
		return TRUE;
	}
	mVideoWindow->Release();
	return FALSE;
}

void CServerDlg::Deactivate()
{
	if (mGraph && mMediaControl)
	{		
		mMediaControl->Stop();	
	}

	KillTimer(mSliderTimer);
	mProgress.SetPos(0);
	SAFE_RELEASE(mFile);
	SAFE_RELEASE(mSplitter);
	SAFE_RELEASE(mInfinitePin);
	SAFE_RELEASE(mAudioInfinitePin);
	SAFE_RELEASE(mTempInfinitePin);
	SAFE_RELEASE(mVideoRenderer);
	SAFE_RELEASE(mAudioRenderer);
	SAFE_RELEASE(mVideoSender);
	SAFE_RELEASE(mAudioSender);
	SAFE_RELEASE(mVideoDecom);
	SAFE_RELEASE(mAudioDecom);

	SAFE_RELEASE(mGraph);
	SAFE_RELEASE(mMediaControl);
	SAFE_RELEASE(mSeeking);
}

void CServerDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	Deactivate();
}

BOOL CServerDlg::CreateAVIFilters()
{
	HRESULT hr = NOERROR;
	BOOL  pass = FALSE;
	IPin * pOut = NULL;
	IPin * pIn  = NULL;
	IFileSourceFilter * mFileFilter;

	if (SUCCEEDED(CoCreateInstance(CLSID_MYFILESOURCEFILTER, NULL, CLSCTX_INPROC_SERVER,
		IID_IFileSourceFilter, (void **)&mFileFilter)))
	{
		WCHAR playingID[200];
		MultiByteToWideChar(CP_ACP,0,mPlayingMedia.mFilePath,-1,playingID,200);
		if(SUCCEEDED(mFileFilter->Load(playingID,NULL)))
		{
			if(SUCCEEDED(mFileFilter->QueryInterface(IID_IBaseFilter,(void **)&mFile)))
			{				
					mGraph->AddFilter(mFile,L"File");
					pass=TRUE;
			}	
		}
		mFileFilter->Release();
	}

	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYAVISPLITTER, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mSplitter)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mSplitter,L"Splitter")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYINFINITEPIN, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mInfinitePin)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mInfinitePin,L"InfinitePin")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mVideoRenderer)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mVideoRenderer,L"VideoRenderer")))
				pass=TRUE;
		}
	}

	if(pass)
	{
	
		pass=FALSE;
		mVideoSender = new CFilterNetSender(NULL, &hr);
		IBaseFilter * pFilter = NULL;
		mVideoSender->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
		if (SUCCEEDED(mGraph->AddFilter(pFilter, L"Video Sender")))
	        pass=TRUE;
	}

	if(pass)
	{
		
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYINFINITEPIN, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mTempInfinitePin)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mTempInfinitePin,L"TempInfinitePin")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mAudioRenderer)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mAudioRenderer,L"AudioRenderer")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		pass=FALSE;
		mAudioSender = new CFilterNetSender(NULL, &hr);
		IBaseFilter * pFilter = NULL;
		mAudioSender->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
		if (SUCCEEDED(mGraph->AddFilter(pFilter, L"Audio Sender")))
	        pass=TRUE;
	}

	if(pass)
	{
		pOut=UFilterUtils::GetPin(mFile,FALSE,"Output");
		pIn=UFilterUtils::GetPin(mSplitter,TRUE,"input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		pOut=UFilterUtils::GetPin(mSplitter,FALSE,"Stream");
		pIn=UFilterUtils::GetPin(mInfinitePin,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mInfinitePin,FALSE,"Output1");
		pIn=UFilterUtils::GetPin(mVideoRenderer,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
		
	}

	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mInfinitePin,FALSE,"Output2");
		pIn=mVideoSender->GetPin(0);
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYINFINITEPIN, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mAudioInfinitePin)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mAudioInfinitePin,L"AudioInfinitePin")))
				pass=TRUE;
		}
	}
	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mSplitter,FALSE,"01");
		pIn=UFilterUtils::GetPin(mAudioInfinitePin,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
		pass=TRUE;
	}

		if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mAudioInfinitePin,FALSE,"Output1");
		pIn=UFilterUtils::GetPin(mAudioRenderer,TRUE,"Audio");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mAudioInfinitePin,FALSE,"Output2");
		pIn=mAudioSender->GetPin(0);
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}
	return pass;
}

BOOL CServerDlg::CreateREALFilters()
{
	HRESULT hr = NOERROR;
	BOOL  pass = FALSE;
	IPin * pOut = NULL;
	IPin * pIn  = NULL;
	IFileSourceFilter * mFileFilter;

	if (SUCCEEDED(CoCreateInstance(CLSID_MYFILESOURCEFILTER, NULL, CLSCTX_INPROC_SERVER,
		IID_IFileSourceFilter, (void **)&mFileFilter)))
	{
		WCHAR playingID[200];
		MultiByteToWideChar(CP_ACP,0,mPlayingMedia.mFilePath,-1,playingID,200);
		if(SUCCEEDED(mFileFilter->Load(playingID,NULL)))
		{
			if(SUCCEEDED(mFileFilter->QueryInterface(IID_IBaseFilter,(void **)&mFile)))
			{				
					mGraph->AddFilter(mFile,L"File");
					pass=TRUE;
			}	
		}
		mFileFilter->Release();
	}

	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYREALSPLITTER, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mSplitter)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mSplitter,L"Splitter")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYINFINITEPIN, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mInfinitePin)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mInfinitePin,L"InfinitePin")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mVideoRenderer)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mVideoRenderer,L"VideoRenderer")))
				pass=TRUE;
		}
	}

	if(pass)
	{
	
		pass=FALSE;
		mVideoSender = new CFilterNetSender(NULL, &hr);
		IBaseFilter * pFilter = NULL;
		mVideoSender->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
		if (SUCCEEDED(mGraph->AddFilter(pFilter, L"Video Sender")))
	        pass=TRUE;
	}

	if(pass)
	{
		
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYINFINITEPIN, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mTempInfinitePin)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mTempInfinitePin,L"TempInfinitePin")))
				pass=TRUE;
		}
	}
	if(pass)
	{
		
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYREALAUDIODECOM, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mAudioDecom)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mAudioDecom,L"AudioDeocm")))
				pass=TRUE;
		}
	}


	if(pass)
	{
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mAudioRenderer)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mAudioRenderer,L"AudioRenderer")))
				pass=TRUE;
		}
	}

	if(pass)
	{
		pass=FALSE;
		mAudioSender = new CFilterNetSender(NULL, &hr);
		IBaseFilter * pFilter = NULL;
		mAudioSender->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
		if (SUCCEEDED(mGraph->AddFilter(pFilter, L"Audio Sender")))
	        pass=TRUE;
	}

	if(pass)
	{
		pOut=UFilterUtils::GetPin(mFile,FALSE,"Output");
		pIn=UFilterUtils::GetPin(mSplitter,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}
	if(pass)
	{
		pOut=UFilterUtils::GetPin(mSplitter,FALSE,"Output 01");
		pIn=UFilterUtils::GetPin(mInfinitePin,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mInfinitePin,FALSE,"Output1");
		pIn=UFilterUtils::GetPin(mVideoRenderer,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
		
	}

	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mInfinitePin,FALSE,"Output2");
		pIn=mVideoSender->GetPin(0);
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		
		pass=FALSE;
		if (SUCCEEDED(CoCreateInstance(CLSID_MYINFINITEPIN, NULL, CLSCTX_INPROC_SERVER,
				IID_IBaseFilter, (void **)&mAudioInfinitePin)))
		{
			if (SUCCEEDED(mGraph->AddFilter(mAudioInfinitePin,L"AudioInfinitePin")))
				pass=TRUE;
		}
	}
	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mSplitter,FALSE,"Output 00");
		pIn=UFilterUtils::GetPin(mAudioInfinitePin,TRUE,"Input");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}

	if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mAudioInfinitePin,FALSE,"Output1");
		pIn=UFilterUtils::GetPin(mAudioDecom,TRUE,"XForm In");
		if (SUCCEEDED(mGraph->Connect(pOut,pIn)))
			pass=TRUE;
	}
		if(pass)
	{
		pass=FALSE;
		pOut=UFilterUtils::GetPin(mAudioDecom,FALSE,"XForm Out");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -