2003-2005年前后开发directShow的程序,只是知道照猫画虎,根据一个例子写另外一个filter,当时写了好多独立的com组件,H.261,H.263,H.264,Mpeg4等视频编解码的Filter,音频方面,G.711,G.729,G.723等Filter。当时把jrtplib对应的也写成了jrtpSendVideo,jrtpRecvVideo,jrtpSendAudio,jrtpRecvAudio等Filter。在进行H.323系统开发的时候,也曾使用Graphedit将其链接起来,进行过处理。并成功开发了H.323项目。后来独立写过处理这些Filter的Demo程序,也就是我在以前提到过的MediaSever程序。
后来开发sip程序,发现这种使用方式,虽然每个模块完全独立,但是在使用过程中,因为每一个组件都可以独立注册,反注册,一旦有人反注册了自己使用的组件,整个应用程序便不能正常工作了。于是就想着把这部分重新整理下。后来因为忙,当然也可以说是懒,就放下了。最近,想起来要整理下这些东西了。
刚刚使用H.264,jrtp做了一个demo程序,实现了对视频的采集和编解码以及rtp收发。这个将所有的组件放在一个模块里面实现。保证不会因别人反注册某个组件影响我们的进程工作。本模块外部调用方法如下:
void CMediaProDemoDlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
CWnd* pWnd = (CWnd*)GetDlgItem(IDC_BUTTON_START);
if(!m_bOpenCamera)
{
pWnd->SetWindowText(_T("停止收发视频"));
m_bOpenCamera = TRUE;
BOOL bOpenRes = CCameraMgr::GetInstance()->OpenCameraMgr();
CWnd* pWndLocalVideo = (CWnd*)GetDlgItem(IDC_STATIC_LOCAL_VIDEO);
CWnd* pWndRemoteVideo = (CWnd*)GetDlgItem(IDC_STATIC_REMOTE_VIDEO);
m_pIndexChannel->SetLocaLVideoHandle(pWndLocalVideo->GetSafeHwnd());
m_pIndexChannel->SetRemoteVideoHandle(pWndRemoteVideo->GetSafeHwnd());
UpdateData(true);
m_pIndexChannel->SetRtpParam(m_nLocalRtpPort,m_nDestRtpPort,m_strDestIp);
m_pIndexChannel->StartThread();
}
else
{
pWnd->SetWindowText(_T("开始收发视频"));
m_bOpenCamera = false;
bool bOpenRes = CCameraMgr::GetInstance()->CloseCameraMgr();
m_pIndexChannel->StopThread();
}
}