国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Microsoft實(shí)時(shí)通信API入門

2019-11-17 04:51:41
字體:
供稿:網(wǎng)友
Microsoft實(shí)時(shí)通信API入門(圖一)  本文提供的方法適合于Microsoft Windows xp 操作系統(tǒng)

  摘要:學(xué)習(xí)如何使用實(shí)時(shí)通信(RTC)API創(chuàng)建音頻與視頻會(huì)議、共享應(yīng)用程序、共享白板、簡單的點(diǎn)對(duì)點(diǎn)聊天對(duì)話以及整合音頻與視頻調(diào)節(jié)向?qū)У慕涌凇?shí)時(shí)通信API為任何基于Microsoft Windows XP的應(yīng)用程序提供了卓越的基于個(gè)人計(jì)算機(jī)的通信性能--即時(shí)消息、音頻與視頻會(huì)議、應(yīng)用程序的共享/協(xié)作。

  以實(shí)時(shí)通信應(yīng)用程序接口來使用內(nèi)容豐富的通信是一個(gè)簡單的過程。

  1. 增強(qiáng)的客戶端應(yīng)用程序決定了客戶端通信平臺(tái)的功能。

  2. 應(yīng)用程序在通信會(huì)話中選擇使用偏愛的音頻與視頻設(shè)備。

  3. 應(yīng)用程序初始化一個(gè)通信會(huì)話。

  4. 實(shí)時(shí)通信層協(xié)調(diào)數(shù)據(jù)的獲得、壓縮和傳輸,應(yīng)用程序傳輸數(shù)據(jù),所使用的音頻與視頻編解碼器是根據(jù)通信的兩者之間的連接質(zhì)量決定的。

  5. 會(huì)話參與者的應(yīng)用程序接收解壓并重放發(fā)送的數(shù)據(jù)。

Microsoft實(shí)時(shí)通信API入門(圖二)
圖⒈音頻/視頻會(huì)議的樣例用戶界面

  本文描述如何把基于PC到PC的實(shí)時(shí)通信添加到一個(gè)應(yīng)用程序中;我們假定你熟悉如何使用COM對(duì)象開發(fā)Windows應(yīng)用程序。同時(shí)我們?cè)谝院蟮奈恼轮袑⒂懻揚(yáng)C到電話、表現(xiàn)以及xml配置。

  樣例代碼說明了使用實(shí)時(shí)通信(RTC)API的優(yōu)點(diǎn),非常方便的產(chǎn)生音頻與視頻會(huì)議、共享應(yīng)用程序、共享白板、簡單的點(diǎn)對(duì)點(diǎn)聊天對(duì)話以及音頻與視頻調(diào)節(jié)向?qū)У慕涌凇?但是在本文中不會(huì)討論其他的通過實(shí)時(shí)通信RTC生效的性能,比如聲學(xué)回波消除(AEC)、向前糾錯(cuò)(FEC)、帶寬測(cè)定、動(dòng)態(tài)抖動(dòng)緩沖器治理、自動(dòng)增益控制(AGC)和質(zhì)量控制(QC)算法等。上面這些特性請(qǐng)參閱 Media Support in the Microsoft Windows Real-Time Communications Client實(shí)時(shí)通信客戶端接口

  需要的頭文件: rtccore.h

  增強(qiáng)功能的應(yīng)用程序獲得帶有使用CLSID_RTCClient(GUID={7a42ea29-a2b7-40c4-b091-f6f024aa89be})的CoCreateInstance()的實(shí)時(shí)通信客戶端接口。 一旦這個(gè)接口可用,Initialize()這個(gè)COM對(duì)象來判定這個(gè)平臺(tái)的通信會(huì)話性能。

//初始化RTC COM對(duì)象
hr = CoCreateInstance (CLSID_RTCClient, NULL,
CLSCTX_INPROC_SERVER, IID_IRTCClient,
(LPVOID *)&m_pClient);
//初始化客戶端接口
hr = m_pClient->Initialize();
  選擇通信類型

  下一步是選擇偏愛的通信和相關(guān)設(shè)備(攝像頭和麥克風(fēng))的類型。 缺省設(shè)置情況是能使用所有的通信類型。 假如通信會(huì)話的參與者能夠共享應(yīng)用程序、傳遞即時(shí)消息、聲音的和視頻,這些性能都能夠自動(dòng)的可用。 假如一個(gè)參與者不支持某種特定的通信類型,那么對(duì)于所有的會(huì)話參與者來說,這種通信類型也是不可用的。

m_pClient->SetPreferredMediaTypes ( RTCMT_ALL, VARIANT_TRUE );
  會(huì)話參與者的平臺(tái)性能和可用帶寬決定了使用何種音頻與視頻編解碼器。

  · 視頻. Windows實(shí)時(shí)通信客戶端在 1/4CIF圖象格式(176×144)分辨率下支持H.261和H.263編解碼器。這些可變比特率編解碼器發(fā)送界于6- 125 Kbps的視頻數(shù)據(jù)。 使用IRTCClient接口方法put_MaxBitRate和put_TemporalSpatialTradeOff可能影響目標(biāo)的視頻轉(zhuǎn)換的空間時(shí)間分辨率。

  · 音頻. Windows實(shí)時(shí)通信客戶端支持許多種音頻編解碼器。 音頻編解碼器是基于終端的連接質(zhì)量而定的。 下面的表格列出了支持的音頻編解碼器。

編解碼器采樣率 (kHz)比特率 (Kbps) 幀尺寸 (msec)G.7118 64 20G.722.1 16 24 20G.723 8 6.4 30, 60, 或 90GSM 8 1320DVI48 32 20SIREN 16 16 20, 或40
  調(diào)整通信設(shè)備

  選擇了通信類型和相關(guān)的設(shè)備后,就可以調(diào)整這些通信設(shè)備了。實(shí)時(shí)通信應(yīng)用程序接口提供了一個(gè)向?qū)?,以便更好的調(diào)節(jié)攝像頭和麥克風(fēng)。 使用RTCClient接口的InvokeTuningWizard()方法來調(diào)節(jié)它們的設(shè)置。

Microsoft實(shí)時(shí)通信API入門(圖三)
圖2攝像頭調(diào)節(jié)向?qū)?br />
Microsoft實(shí)時(shí)通信API入門(圖四)
圖3麥克風(fēng)調(diào)節(jié)向?qū)?br />
  初始化一個(gè)會(huì)話

  在應(yīng)用程序能夠與其它參與者連接之前,它必須能夠處理在會(huì)話期間實(shí)時(shí)通信fire off的事件。 在PC到PC的通信中,應(yīng)用程序捕捉即時(shí)消息、音量強(qiáng)度、媒體、客戶端消息和會(huì)話狀態(tài)改變等事件。 下面的代碼說明了如何只創(chuàng)建一個(gè)事件過濾器來捕捉特定的RTC事件類型。

  lEventMask設(shè)置了應(yīng)用程序感愛好的一組事件。 (假如想要得到一個(gè)完整的事件列表,請(qǐng)?jiān)贛SDN網(wǎng)站上搜索RTC_EVENT以便取得每個(gè)事件的具體信息。) CRTCEvents類為附屬的客戶端發(fā)送事件。 RTCEvents對(duì)象在應(yīng)用程序和IRTCEventNotification接口之間創(chuàng)建一個(gè)接口。 所有的實(shí)時(shí)通信事件將由RTCEvents類處理。


//設(shè)置事件過濾器來監(jiān)聽RTC事件
//使用RTCEF_ALL監(jiān)聽所有的事件
//對(duì)于樣例應(yīng)用程序,我們將說明如何為一個(gè)有限的事件集設(shè)置事件監(jiān)聽者。
long lEventMask = RTCEF_session_STATE_CHANGE
RTCEF_MESSAGING
RTCEF_MEDIA
RTCEF_INTENSITY
RTCEF_CLIENT;

hr = m_pClient->put_EventFilter( lEventMask );

//創(chuàng)建事件的接收端對(duì)象
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);
  在一個(gè)會(huì)話期間,音頻與視頻媒體類型可以被添加也可以被刪除,所以客戶端必須監(jiān)聽這些事件類型。請(qǐng)參閱本文"處理實(shí)時(shí)流會(huì)話事件"部分獲取關(guān)于狀態(tài)改變和事件處理的內(nèi)容。處理實(shí)時(shí)通信事件

  一旦事件處理器被IRTCEventNotification接收端注冊(cè),那么接收和處理實(shí)時(shí)通信事件就非常簡單了。 當(dāng)實(shí)時(shí)通信事件被樣例應(yīng)用程序接收的時(shí)候,應(yīng)用程序的事件處理程序發(fā)送一個(gè)消息到這個(gè)應(yīng)用程序的消息處理程序。 OnRTCEvent()函數(shù)處理所有的由應(yīng)用程序接收的所有的不同類型的事件。

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;
….
….
….
}
  創(chuàng)建一個(gè)通信會(huì)話

  在能夠使用實(shí)時(shí)通信之前,必須創(chuàng)建和初始化一個(gè)通信會(huì)話。然后你就可以輸入?yún)⑴c者的IP地址來開始通話了。也可以通過輸入一個(gè)電子郵件地址或者一個(gè)電話號(hào)碼來激活一個(gè)通信會(huì)話。然而,這個(gè)函數(shù)需要SIP注冊(cè)服務(wù)器,這在本文討論范圍之外了。我們將在下篇文章中談?wù)勥@個(gè)話題。

  實(shí)時(shí)通信不支持多個(gè)視頻會(huì)議會(huì)話同時(shí)運(yùn)行,所以這個(gè)應(yīng)用程序在初始化一個(gè)新的會(huì)話之前,必須首先檢驗(yàn)?zāi)壳皼]有運(yùn)行視頻會(huì)議會(huì)話。在第一個(gè)發(fā)行版本中,Windows實(shí)時(shí)通信客戶端只支持多個(gè)電話到電話的通信會(huì)話,而不支持多個(gè)音頻與視頻或者只有音頻的會(huì)議。

  為了與另一臺(tái)計(jì)算機(jī)通話,需要識(shí)別實(shí)時(shí)通信會(huì)話類型并創(chuàng)建一個(gè)使用IRTCSession接口的會(huì)話類型。下面的代碼說明如何創(chuàng)建會(huì)話。

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;
}
  處理實(shí)時(shí)流會(huì)話事件

  根據(jù)會(huì)話類型,可能有RTC媒體事件、音頻強(qiáng)度事件、即時(shí)消息事件和會(huì)話狀態(tài)改變等。

  媒體事件

  處理媒體事件需要取得媒體類型,然后取得事件類型和原因,然后把消息發(fā)送到會(huì)話窗口。 應(yīng)用程序可以使用get_MediaType()方法接收用于音頻、視頻、T120和實(shí)時(shí)轉(zhuǎn)送協(xié)議(RTP)事件的消息。 樣例應(yīng)用程序說明了如何檢索媒體事件并且把它傳送到媒體對(duì)話框。

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);
}
}
  強(qiáng)度事件

  強(qiáng)度事件是當(dāng)揚(yáng)聲器或者麥克風(fēng)設(shè)備的強(qiáng)度等級(jí)改變的時(shí)候發(fā)生的事件。 應(yīng)用程序可以使用get_Direction ()函數(shù)獲得改變的音頻設(shè)備。 一旦設(shè)備被確定,應(yīng)用程序可以取得當(dāng)前的設(shè)備屬性和處理改變。 應(yīng)用程序可以通過一個(gè)滑動(dòng)器控件或者音量表來向用戶顯示音量大小的改變。


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);
}
}
  即時(shí)消息事件

  即時(shí)報(bào)文信息通過IRTCMessagingEvent接口在參與者之間傳送。 當(dāng)一個(gè)消息事件發(fā)生時(shí),這個(gè)應(yīng)用程序必須獲得會(huì)話和事件類型并且取得會(huì)話相關(guān)的參與者,以便消息可以被發(fā)送到相應(yīng)的參與者。 事件處理程序也可以處理參與者會(huì)話狀態(tài)的任何改變。

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;
}
  會(huì)話狀態(tài)改變事件

  會(huì)話狀態(tài)改變遵循和其他實(shí)時(shí)通信事件一樣的過程。 會(huì)話狀態(tài)改變可能包括設(shè)置一個(gè)新的音頻/視頻會(huì)話或者向客戶端通知一條即時(shí)消息即將到來。下面的例程說明當(dāng)一條通信會(huì)話請(qǐng)求被接收時(shí)發(fā)生了什么;一聲鈴聲通知客戶端請(qǐng)求到來,請(qǐng)求被應(yīng)答,然后通信會(huì)話開始。

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();
}
}
...
}
  共享應(yīng)用程序

  啟動(dòng)T120應(yīng)用程序共享就象調(diào)用IRTCClient接口相關(guān)的StartT120Applet方法一樣簡單。

hr = m_pClient->StartT120Applet ( RTCTA_APPSHARING );
  支持白板

  為了添加白板支持到應(yīng)用程序中,需要使用RTCTA_WHITEBOARD枚舉調(diào)用StartT120Applet方法。
hr = m_pClient->StartT120Applet ( RTCTA_WHITEBOARD );

  結(jié)束會(huì)話

  為了結(jié)束一個(gè)通信會(huì)話,所有運(yùn)行的應(yīng)用程序必須被關(guān)閉。然后實(shí)時(shí)通信客戶端接口調(diào)用ShutDown()和完成結(jié)束通信會(huì)話的過程。

  平臺(tái)性能

  使用實(shí)時(shí)通信的豐富客戶端通信特點(diǎn)需要一個(gè)有合適性能的處理器。 在下面例程中,在運(yùn)行實(shí)時(shí)通信性能的時(shí)候使用一個(gè)1 GHz的 Pentium? III處理器和一個(gè)2.2 GHz的Pentium 4來測(cè)定處理器使用率。 下面的表格給出了使用本文中提到的實(shí)時(shí)通信性能的處理器使用率的百分率。

任務(wù) 2.2-GHz 的Pentium 4處理器 (% CPU使用率)1 1.0-GHz的Pentium III 處理器 (% CPU 使用率)2只使用音頻/視頻會(huì)議9% 22%添加應(yīng)用程序(共享IE) 10%
35%添加白板 12% 37%添加即時(shí)消息12% 37%
  注1 Pentium 4處理器平臺(tái)配置:Intel Desktop Board D850MV; 256MB PC800 RDRAM,板載的聲卡,nVidia GeForce 2 Ultra顯卡;Windows XP Professional

  注2 Pentium III 處理器平臺(tái)配置:Intel Desktop Board VC820;256MB PC133 SDRAM,nVidia GeForce 2 Ultra顯卡,Creative Sound Blaster Live聲卡,Windows XP Professional

  小結(jié)

  在Windows XP下使用時(shí)實(shí)通信客戶端應(yīng)用程序接口已經(jīng)大大的簡化了開發(fā)通信工具的難度。 開發(fā)者可以快速地設(shè)計(jì)、定型和開發(fā)他們的通信應(yīng)用程序。 現(xiàn)有的音頻與視頻會(huì)議應(yīng)用程序可以通過添加豐富的通信性能而受益于實(shí)時(shí)通信。 使用實(shí)時(shí)通信應(yīng)用程序接口開發(fā)應(yīng)用程序也受益于一個(gè)統(tǒng)一通信協(xié)議。 這增加了你的應(yīng)用程序與其它的正文信息和音頻/視頻會(huì)議應(yīng)用程序的相互適應(yīng)性。結(jié)合了Intel處理器和Microsoft Windows XP的強(qiáng)大功能的實(shí)時(shí)通信應(yīng)用程序接口給你帶來了一個(gè)終端通信經(jīng)歷的革命。

  本文源代碼下載

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武强县| 景谷| 汶上县| 始兴县| 峨眉山市| 华坪县| 苍梧县| 旌德县| 杂多县| 阿瓦提县| 罗甸县| 融水| 神池县| 太谷县| 县级市| 咸宁市| 元阳县| 海安县| 武安市| 北宁市| 苗栗县| 水城县| 罗田县| 长宁区| 新乐市| 罗城| 武邑县| 丰县| 资兴市| 渭源县| 绍兴市| 隆安县| 湖口县| 耿马| 自治县| 明水县| 逊克县| 灵武市| 白城市| 连州市| 离岛区|