动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 软件工程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 软件工程 ]的信息



本月文章推荐
.UML类图详解.
.项目管理中关于需求分析的总结.
.安全的SOA提高MedicAlert公司可靠.
.软件系统分析的方法和策略.
.对Windows .NET Server的评估.
..NET泛型技巧之打造可复用的抽象.
.业务需求访谈中需要注意的重要法.
.SOA扩展Web服务的前景(一).
.走出一般性的建模误区.
.WinCE 进程、线程和内存管理(一).
.为什么要用UML建模之面向对象建模.
.利用UML类图设计Java应用程序详解.
.软件项目质量管理经验谈.
.六西格玛失败经验谈.
.绘制UML活动图的步骤和要点.
.利用iTextSharp生成Pdf一个小例子.
.Microsoft .NET让新一代因特网变.
.VS2005与SQL Server2005的整合优.
.谈谈软件项目管理的重要性目录.
.“不完美”的VS 2005 Team System.

Microsoft实时通信API入门

发表日期:2008-3-23 |


Microsoft实时通信API入门(图一)  本文提供的方法适合于Microsoft Windows XP 操作系统

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

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

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

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

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

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

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

Microsoft实时通信API入门(图二)
图⒈音频/视频会议的样例用户界面

  本文描述如何把基于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()方法来调节它们的设置。

Microsoft实时通信API入门(图三)
图2摄像头调节向导

Microsoft实时通信API入门(图四)
图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的强大功能的实时通信应用程序接口给你带来了一个终端通信经历的革命。

  本文源代码下载
上一篇:小型软件的通用界面设计制作指南 人气:403
下一篇:亲身探究Windows操作系统内核工作原理 人气:361
浏览全部软件工程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-23 Menalto Gallery v2.3 Rc1 多国语
2008-7-23 深度学习网址导航系统 v2.6.1
2008-7-23 因特达crm2008客户关系管理系统
2008-7-23 60度 CMS v1.0 Build 080723
2008-7-23 幻影动漫网视频系统(Ppdong) v1.
2008-7-23 好易祝福墙 2008
2008-7-23 APJE私服发布系统 v2.0 PHP版
2008-7-23 毕业论文在线指导系统源码
2008-7-23 Jacky法律在线网站源码
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵