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

📄 myendpoint.cpp

📁 一个简单的视频会议VC++MFC工程文件
💻 CPP
字号:
/*
*/
// MyEndPoint.cpp: implementation of the CMyEndPoint class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "VISEP.h"
#include "MyEndPoint.h"
#include "VISEPDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//捕获视频流
void CMyVideoGrabber::OnStream(BYTE *frame,int width,int height)
{
	//实现显示本地视频
	BYTE * p=m_dlg.m_localVideo.GetBuffer(width,height);
	if(p)
	{
		memcpy(p,frame,width*height*3);
		m_dlg.m_localVideo.ReleaseBuffer();
	}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyEndPoint::CMyEndPoint(CVISEPDlg &dlg):CH323EndPoint(TRUE),m_dlg(dlg),m_grabber(dlg)
{
	
}

CMyEndPoint::~CMyEndPoint()
{

}

CString CMyEndPoint::GetRemoteName(DWORD connID)
{
	CString ret;
	char name[256]="";
	GetRemotePartyName(connID,name,256);
	ret=name;
	//去掉remotePartyName后面跟的IP地址
	int i=ret.ReverseFind('[');
	if(i>=0)
	{
		ret.Delete(i,ret.GetLength()-i);
		ret.TrimRight(' ');
	}
	return ret;

}

void CMyEndPoint::OnAnswerCall(DWORD connID,const char *RoomID)
{
	m_dlg.OnAnswerCall(connID);
}

void CMyEndPoint::OnWaitForAnswer(DWORD connID)
{
	m_dlg.OnWaitForAnswer();
}

void CMyEndPoint::OnConnectionCleared(DWORD connID, DWORD duration,enum CallEndReason reason)
{
	m_dlg.OnCallEnded(duration,reason);
}

void CMyEndPoint::OnConnectionEstablished(DWORD connID)
{
	m_dlg.OnTalking();
}

void CMyEndPoint::OnReceiveUserInput(DWORD connID,const char* value)
{

}

void CMyEndPoint::OnReceiveNonStandardMsg(DWORD connID,const char* value)
{
	m_dlg.OnReceiveNonStandardMsg(value);
}

BOOL CMyEndPoint::OnRenderAudioFrame(DWORD connID,BYTE* frame,int len)
{
	//直接将数据输出到播放设备
	return m_player.Write(frame,len);
}

BOOL CMyEndPoint::OnReadAudioFrame(DWORD connID,BYTE* frame,int len)
{
	//直接从录音设备读取数据
	return m_recorder.Read(frame,len);
}
	
BOOL CMyEndPoint::OnAudioStop(DWORD connID, BOOL outgoing,const char *CodecName)
{
	if(outgoing)
	{
		m_recorder.Close();
	}
	else
	{
		m_player.Close();
	}
	return TRUE;
}

BOOL CMyEndPoint::OnAudioStart(DWORD connID,BOOL outgoing,const char *CodecName)
{
	BOOL ret=FALSE;
	CWinApp *app=AfxGetApp();
	if(outgoing)
	{
		//打开录音设备
		ret=m_recorder.Open(app->GetProfileInt("",KEY_AUDIO_INPUT_DEVICE,0));
	}
	else
	{
		//打开播放设备	
		ret=m_player.Open(app->GetProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,0));
	}
	return ret;
}

BOOL CMyEndPoint::OnRenderVideoFrame(DWORD connID,BYTE *frame, int width, int height)
{
	//画出远端视频
	BYTE * p=m_dlg.m_remoteVideo.GetBuffer(width,height);
	if(p)
	{
		memcpy(p,frame,width*height*3);
		m_dlg.m_remoteVideo.ReleaseBuffer();
	}
	return TRUE;
}

BOOL CMyEndPoint::OnReadVideoFrame(DWORD connID,BYTE* frame,int width,int height)
{
	//从视频捕获设备读取视频帧
	return m_grabber.Read(frame,width,height);
}
	
BOOL CMyEndPoint::OnVideoStop(DWORD connID,BOOL outgoing,const char *CodecName)
{
	if(outgoing)
	{
		//停止发送视频。如果本地视频窗口没有开启,就将视频捕获设备关闭
		if(m_dlg.m_localVideo.m_hWnd==NULL)
		{
			m_grabber.Close();
		}
		m_dlg.GetMenu()->ModifyMenu(ID_SEND_VIDEO,MF_BYCOMMAND|MF_STRING,ID_SEND_VIDEO,"开始发送视频(&S)");
	}
	else
	{	
		//停止接收远端视频。如果远端视频窗口开启,自动将它关闭
		if(m_dlg.m_remoteVideo.m_hWnd!=NULL)
			m_dlg.SendMessage(WM_COMMAND,ID_REMOTE_VIDEO);
	}
	return TRUE;
}

BOOL CMyEndPoint::OnVideoStart(DWORD connID,BOOL outgoing,const char* CodecName)
{
	BOOL ret=FALSE;
	if(outgoing)
	{
		//开始发送视频
		if(m_grabber.IsOpened())
		{
			//视频捕捉设备已经开启
			ret=TRUE;
		}
		else
		{
			//打开视频捕捉设备
			CWinApp *app=AfxGetApp();
			ret=m_grabber.Open(app->GetProfileInt("",KEY_VIDEO_DEVICE,0));
			if(ret)
			{
				m_dlg.GetMenu()->ModifyMenu(ID_SEND_VIDEO,MF_BYCOMMAND|MF_STRING,ID_SEND_VIDEO,"停止发送视频(&S)");
			}
		}
	}
	else
	{
		//开始接收远端视频
		if(m_dlg.m_remoteVideo.m_hWnd==NULL)
			m_dlg.SendMessage(WM_COMMAND,ID_REMOTE_VIDEO);
		ret=TRUE;
	}
	return ret;
}

void CMyEndPoint::OnUseGatekeeper(enum UseGKResult result,const char* name_GK)
{
	if(result==RegistrationSuccessful)
	{
		//成功登录到网守
		m_dlg.GetMenu()->EnableMenuItem(ID_LOGOUT,MF_BYCOMMAND|MF_ENABLED);
		CString s;
		s.Format("网守: %s",name_GK);
		m_dlg.m_statusBar.SetText(s,3,0);
	}
	else
	{
		AfxMessageBox("登录网守失败!");
		m_dlg.GetMenu()->EnableMenuItem(ID_LOGIN,MF_BYCOMMAND|MF_ENABLED);
		m_dlg.m_statusBar.SetText("未登录到网守",3,0);
	}
}

⌨️ 快捷键说明

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