科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Microsoft实时通信API入门

Microsoft实时通信API入门

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

学习如何使用实时通信(RTC)API创建音频与视频会议、共享应用程序......

作者:wayne编译 来源:yesky 2007年11月4日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
处理实时通信事件

  一旦事件处理器被IRTCEventNotification接收端注册,那么接收和处理实时通信事件就非常简单了。 当实时通信事件被样例应用程序接收的时候,应用程序的事件处理程序发送一个消息到这个应用程序的消息处理程序。 OnRTCEvent()函数处理所有的由应用程序接收的所有的不同类型的事件。

OnRTCEvent(UINT message, WPARAM wParam, LPARAM lParam)
{

// Based on the RTC_EVENT type, query for the
// appropriate event interface and call a helper
// method to handle the event
switch ( wParam )
{
….
….
….
case RTCE_MEDIA:
{
IRTCMediaEvent * pEvent = NULL;

hr = pDisp->QueryInterface( IID_IRTCMediaEvent,
(void **)&pEvent );

if (SUCCEEDED(hr))
{
OnRTCMediaEvent(pEvent);
SAFE_RELEASE(pEvent);
}
}
break;
….
….
….
}

  创建一个通信会话

  在能够使用实时通信之前,必须创建和初始化一个通信会话。然后你就可以输入参与者的IP地址来开始通话了。也可以通过输入一个电子邮件地址或者一个电话号码来激活一个通信会话。然而,这个函数需要SIP注册服务器,这在本文讨论范围之外了。我们将在下篇文章中谈谈这个话题。

  实时通信不支持多个视频会议会话同时运行,所以这个应用程序在初始化一个新的会话之前,必须首先检验目前没有运行视频会议会话。在第一个发行版本中,Windows实时通信客户端只支持多个电话到电话的通信会话,而不支持多个音频与视频或者只有音频的会议。

  为了与另一台计算机通话,需要识别实时通信会话类型并创建一个使用IRTCSession接口的会话类型。下面的代码说明如何创建会话。

HRESULT CAVDConfDlg::MakeCall(RTC_SESSION_TYPE enType, BSTR bstrURI)
{
...

// Create the session
IRTCSession * pSession = NULL;

hr = m_pClient->CreateSession(enType, NULL, NULL, 0, &pSession);

// Add the participant to the session
hr = pSession->AddParticipant(bstrURI, NULL, &m_Participant);

...
return S_OK;
}

  处理实时流会话事件

  根据会话类型,可能有RTC媒体事件、音频强度事件、即时消息事件和会话状态改变等。

  媒体事件

  处理媒体事件需要取得媒体类型,然后取得事件类型和原因,然后把消息发送到会话窗口。 应用程序可以使用get_MediaType()方法接收用于音频、视频、T120和实时转送协议(RTP)事件的消息。 样例应用程序说明了如何检索媒体事件并且把它传送到媒体对话框。

void CAVDConfDlg::OnRTCMediaEvent(IRTCMediaEvent *pEvent)
{
...

hr = pEvent->get_MediaType(&lMediaType);

hr = pEvent->get_EventType(&enType);

hr = pEvent->get_EventReason(&enReason);

if ((m_AVDlg) && (m_AVDlg.GetState () != RTCSS_IDLE))
{
// Deliver the media state to the session window
m_AVDlg.DeliverMedia(lMediaType, enType, enReason);
}
}

  强度事件

  强度事件是当扬声器或者麦克风设备的强度等级改变的时候发生的事件。 应用程序可以使用get_Direction ()函数获得改变的音频设备。 一旦设备被确定,应用程序可以取得当前的设备属性和处理改变。 应用程序可以通过一个滑动器控件或者音量表来向用户显示音量大小的改变。

void CAVDConfDlg::OnRTCIntensityEvent(IRTCIntensityEvent *pEvent)
{
...

hr = pEvent->get_Direction(&enDevice);

hr = pEvent->get_Level(&lLevel);

hr = pEvent->get_Min(&lMin);

hr = pEvent->get_Max(&lMax);

if (m_AVDlg.GetState () != RTCSS_IDLE)
{
// Deliver the intensity state to the session window
m_AVDlg.DeliverIntensity(enDevice, lLevel);
}
}

  即时消息事件

  即时报文信息通过IRTCMessagingEvent接口在参与者之间传送。 当一个消息事件发生时,这个应用程序必须获得会话和事件类型并且取得会话相关的参与者,以便消息可以被发送到相应的参与者。 事件处理程序也可以处理参与者会话状态的任何改变。

HRESULT CAVDConfDlg::OnRTCMessagingEvent(IRTCMessagingEvent *pEvent)
{
...

hr = pEvent->get_Session(&pSession);

hr = pEvent->get_EventType(&enType);

hr = pEvent->get_Participant(&pParticipant);

if (enType == RTCMSET_MESSAGE)
{
hr = pEvent->get_MessageHeader(&bstrContentType);

hr = pEvent->get_Message(&bstrMessage);

// Deliver the message to the session window
if (m_cMessageDlg)
m_cMessageDlg.DeliverMessage(pParticipant, bstrContentType,
bstrMessage);

}
else if (enType == RTCMSET_STATUS)
{
hr = pEvent->get_UserStatus(&enStatus);

// Deliver the user status to the session window
m_cMessageDlg.DeliverUserStatus(pParticipant, enStatus);
}
return S_OK;
}

  会话状态改变事件

  会话状态改变遵循和其他实时通信事件一样的过程。 会话状态改变可能包括设置一个新的音频/视频会话或者向客户端通知一条即时消息即将到来。下面的例程说明当一条通信会话请求被接收时发生了什么;一声铃声通知客户端请求到来,请求被应答,然后通信会话开始。

Void CAVDConfDlg::OnRTCSessionStateChangeEvent(IRTCSessionStateChangeEvent
*pEvent)
{
...

hr = pEvent->get_State(&enState);

hr = pEvent->get_Session(&pSession);

switch ( enState )
{
case RTCSS_INCOMING:
{
...

// This event is called when an incoming call occurs
RTC_SESSION_TYPE enType;

hr = pSession->get_Type(&enType);

// Ring the bell
m_pClient->PlayRing(RTCRT_PHONE, VARIANT_TRUE);

// Accept the session
hr = pSession->Answer();
}
}
...
}

  共享应用程序

  启动T120应用程序共享就象调用IRTCClient接口相关的StartT120Applet方法一样简单。

hr = m_pClient->StartT120Applet ( RTCTA_APPSHARING );

  支持白板

  为了添加白板支持到应用程序中,需要使用RTCTA_WHITEBOARD枚举调用StartT120Applet方法。
hr = m_pClient->StartT120Applet ( RTCTA_WHITEBOARD );

  结束会话

  为了结束一个通信会话,所有运行的应用程序必须被关闭。然后实时通信客户端接口调用ShutDown()和完成结束通信会话的过程。

  平台性能

  使用实时通信的丰富客户端通信特点需要一个有合适性能的处理器。 在下面例程中,在运行实时通信性能的时候使用一个1 GHz的 Pentium? III处理器和一个2.2 GHz的Pentium 4来测定处理器使用率。 下面的表格给出了使用本文中提到的实时通信性能的处理器使用率的百分率。

任务 2.2-GHz 的Pentium 4处理器 (% CPU使用率)1 1.0-GHz的Pentium III 处理器 (% CPU 使用率)2
只使用音频/视频会议 9% 22%
添加应用程序(共享IE) 10% 35%
添加白板 12% 37%
添加即时消息 12% 37%

  注1 Pentium 4处理器平台配置:Intel Desktop Board D850MV; 256MB PC800 RDRAM,板载的声卡,nVidia GeForce 2 Ultra显卡;Windows XP Professional

  注2 Pentium III 处理器平台配置:Intel Desktop Board VC820;256MB PC133 SDRAM,nVidia GeForce 2 Ultra显卡,Creative Sound Blaster Live声卡,Windows XP Professional

  小结

  在Windows XP下使用时实通信客户端应用程序接口已经大大的简化了开发通信工具的难度。 开发者可以快速地设计、定型和开发他们的通信应用程序。 现有的音频与视频会议应用程序可以通过添加丰富的通信性能而受益于实时通信。 使用实时通信应用程序接口开发应用程序也受益于一个统一通信协议。 这增加了你的应用程序与其它的正文信息和音频/视频会议应用程序的相互适应性。结合了Intel处理器和Microsoft Windows XP的强大功能的实时通信应用程序接口给你带来了一个终端通信经历的革命。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章