分享
 
 
 

Microsoft实时通信API入门

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

本文提供的方法适合于Microsoft Windows xp 操作系统

摘要:学习如何使用实时通信(RTC)API创建音频与视频会议、共享应用程序、共享白板、简单的点对点聊天对话以及整合音频与视频调节向导的接口。实时通信API为任何基于Microsoft Windows XP的应用程序提供了卓越的基于个人计算机的通信性能--即时消息、音频与视频会议、应用程序的共享/协作。

以实时通信应用程序接口来使用内容丰富的通信是一个简单的过程。

1. 增强的客户端应用程序决定了客户端通信平台的功能。

2. 应用程序在通信会话中选择使用偏爱的音频与视频设备。

3. 应用程序初始化一个通信会话。

4. 实时通信层协调数据的获得、压缩和传输,应用程序传输数据,所使用的音频与视频编解码器是根据通信的两者之间的连接质量决定的。

5. 会话参与者的应用程序接收解压并重放发送的数据。

图⒈音频/视频会议的样例用户界面

本文描述如何把基于PC到PC的实时通信添加到一个应用程序中;我们假定你熟悉如何使用COM对象开发Windows应用程序。同时我们在以后的文章中将讨论PC到电话、表现以及xml配置。

样例代码说明了使用实时通信(RTC)API的优点,非常方便的产生音频与视频会议、共享应用程序、共享白板、简单的点对点聊天对话以及音频与视频调节向导的接口。 但是在本文中不会讨论其他的通过实时通信RTC生效的性能,比如声学回波消除(AEC)、向前纠错(FEC)、带宽测定、动态抖动缓冲器治理、自动增益控制(AGC)和质量控制(QC)算法等。上面这些特性请参阅 Media Support in the Microsoft Windows Real-Time Communications Client实时通信客户端接口

需要的头文件: rtccore.h

增强功能的应用程序获得带有使用CLSID_RTCClient(GUID={7a42ea29-a2b7-40c4-b091-f6f024aa89be})的CoCreateInstance()的实时通信客户端接口。 一旦这个接口可用,Initialize()这个COM对象来判定这个平台的通信会话性能。

//初始化RTC COM对象

hr = CoCreateInstance (CLSID_RTCClient, NULL,

CLSCTX_INPROC_SERVER, IID_IRTCClient,

(LPVOID *)&m_pClient);

//初始化客户端接口

hr = m_pClient->Initialize();

选择通信类型

下一步是选择偏爱的通信和相关设备(摄像头和麦克风)的类型。 缺省设置情况是能使用所有的通信类型。 假如通信会话的参与者能够共享应用程序、传递即时消息、声音的和视频,这些性能都能够自动的可用。 假如一个参与者不支持某种特定的通信类型,那么对于所有的会话参与者来说,这种通信类型也是不可用的。

m_pClient->SetPreferredMediaTypes ( RTCMT_ALL, VARIANT_TRUE );

会话参与者的平台性能和可用带宽决定了使用何种音频与视频编解码器。

· 视频. Windows实时通信客户端在 1/4CIF图象格式(176×144)分辨率下支持H.261和H.263编解码器。这些可变比特率编解码器发送界于6- 125 Kbps的视频数据。 使用IRTCClient接口方法put_MaxBitRate和put_TemporalSpatialTradeOff可能影响目标的视频转换的空间时间分辨率。

· 音频. Windows实时通信客户端支持许多种音频编解码器。 音频编解码器是基于终端的连接质量而定的。 下面的表格列出了支持的音频编解码器。

编解码器

采样率 (kHz)

比特率 (Kbps)

帧尺寸 (msec)

G.711

8

64

20

G.722.1

16

24

20

G.723

8

6.4

30, 60, 或 90

GSM

8

13

20

DVI4

8

32

20

SIREN

16

16

20, 或40

调整通信设备

选择了通信类型和相关的设备后,就可以调整这些通信设备了。实时通信应用程序接口提供了一个向导,以便更好的调节摄像头和麦克风。 使用RTCClient接口的InvokeTuningWizard()方法来调节它们的设置。

图2摄像头调节向导

图3麦克风调节向导

初始化一个会话

在应用程序能够与其它参与者连接之前,它必须能够处理在会话期间实时通信fire off的事件。 在PC到PC的通信中,应用程序捕捉即时消息、音量强度、媒体、客户端消息和会话状态改变等事件。 下面的代码说明了如何只创建一个事件过滤器来捕捉特定的RTC事件类型。

lEventMask设置了应用程序感爱好的一组事件。 (假如想要得到一个完整的事件列表,请在MSDN网站上搜索RTC_EVENT以便取得每个事件的具体信息。) CRTCEvents类为附属的客户端发送事件。 RTCEvents对象在应用程序和IRTCEventNotification接口之间创建一个接口。 所有的实时通信事件将由RTCEvents类处理。

//设置事件过滤器来监听RTC事件

//使用RTCEF_ALL监听所有的事件

//对于样例应用程序,我们将说明如何为一个有限的事件集设置事件监听者。

long lEventMask = RTCEF_session_STATE_CHANGE

RTCEF_MESSAGING

RTCEF_MEDIA

RTCEF_INTENSITY

RTCEF_CLIENT;

hr = m_pClient->put_EventFilter( lEventMask );

//创建事件的接收端对象

m_pEvents = new CRTCEvents;

//初始化事件处理器

hr = m_pEvents->Advise( m_pClient, m_hWnd );

// Set the listen mode for RTC client

// RTCLM_BOTH opens the standard Sip port 5060, as well as

// a dynamic port.

hr = m_pClient->put_ListenForIncomingSessions(RTCLM_BOTH);

在一个会话期间,音频与视频媒体类型可以被添加也可以被删除,所以客户端必须监听这些事件类型。请参阅本文"处理实时流会话事件"部分获取关于状态改变和事件处理的内容。处理实时通信事件

一旦事件处理器被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的强大功能的实时通信应用程序接口给你带来了一个终端通信经历的革命。

本文源代码下载

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有