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

📄 serverdlg.cpp

📁 采用DirecShow通过网络传输实现远程视频动态播放,
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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::CreateOGGFilters()
{
	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_MYOGGSPLITTER, 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,"Video");
		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,"Vorbis");
		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::CreateMPEGFilters()
{
		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_MYMPEGSPLITTER, 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,"Video");
		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,"Audio");
		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;

}

void CServerDlg::SendSimpleCommand(long inCommand)
{
	char  buf[MAX_COMMAND_SIZE];
	long  len  = sizeof(Net_Command);
	// Specify command id first
	long * pCmd = (long *) buf;
	*pCmd = inCommand;
	*pCmd = htonl(*pCmd);
     mControll.Send(buf, len);
}

void CServerDlg::OnTimer(UINT nIDEvent) 
{
    if(nIDEvent==mSliderTimer)
	{
		double pos=0,duration=1;
		if (mSeeking)
		{
			GetCurrentPosition(&pos);
			GetDuration(&duration);
			int newpos=int(pos*1000/duration);
			if(mProgress.GetPos()!=newpos)
			{
				mProgress.SetPos(newpos);
				SendProgress(newpos);
			}
		}
	}
	CDialog::OnTimer(nIDEvent);
}

void CServerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	if(pScrollBar->GetSafeHwnd()==mProgress.GetSafeHwnd())
	{
		if(mGraph)
		{
			double duration=1;
			GetDuration(&duration);
			double pos=duration*mProgress.GetPos()/1000.;
			SetCurrentPosition(pos);
		}
	}
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CServerDlg::GetDuration(double *outDuration)
{
	if (mSeeking)
	{
		__int64 length = 0;
		if (SUCCEEDED(mSeeking->GetDuration(&length)))
		{
			*outDuration = ((double)length) / 10000000.;
		}
	}

}

void CServerDlg::GetCurrentPosition(double *outPosition)
{
	if (mSeeking)
	{
		__int64 position = 0;
		if (SUCCEEDED(mSeeking->GetCurrentPosition(&position)))
		{
			*outPosition = ((double)position) / 10000000.;		
		}
	}
}

void CServerDlg::SetCurrentPosition(double inPosition)
{
	if (mSeeking)
	{
		__int64 one = 10000000;
		__int64 position = (__int64)(one * inPosition);
		HRESULT hr = mSeeking->SetPositions(&position, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame, 
			0, AM_SEEKING_NoPositioning);
	}
}

void CServerDlg::SendProgress(int pos)
{
	char  buf[MAX_COMMAND_SIZE];
	long  len  = sizeof(Net_Command) + sizeof(Media_Progress);
	long * pCmd = (long *) buf;
	*pCmd = Cmd_SetProgress;
	*pCmd = htonl(*pCmd);
	pCmd++;
	Media_Progress * pData = (Media_Progress *) pCmd;
	pData->program_Progress = pos;
	pData->my_hton();
	mControll.Send(buf, len);
}

⌨️ 快捷键说明

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