mediaAttrib->addValueAttribute( attrib );
mediaAttrib->addmap( rtpMapAttrib );
}
else//如果mediaAttrib為0的情況,也就是"a="項目為空的情況
{
cpLog(LOG_DEBUG, "no mediaAttrib");
mediaAttrib = new MediaAttributes();
assert(mediaAttrib);
(*mediaIterator)->setMediaAttributes(mediaAttrib);
// create the new value attribute object
ValueAttribute* attrib = new ValueAttribute();
// set the attribute and its value
attrib->setAttribute("ptime");
LocalScopeAllocator lo;
//通過Cfg文件獲取RTP傳輸速率,創(chuàng)建一個a=ptime:<分組時間>的對話屬性。 attrib->setValue( Data( UaConfiguration::instance()->getNetworkRtpRate()
).getData(lo) );
//add the rtpmap attribute for the default codec
SdpRtpMapAttribute* rtpMapAttrib = new SdpRtpMapAttribute();
rtpMapAttrib->setPayloadType(0);
rtpMapAttrib->setEncodingName("PCMU");
rtpMapAttrib->setClockRate(8000);
// 增加新創(chuàng)建的會話屬性到本地的SDP當(dāng)中
mediaAttrib->addValueAttribute(attrib);
mediaAttrib->addmap(rtpMapAttrib);
}
localSdp->setSdpDescriptor(sdpDesc);
//回送OK給主叫端,并且通告本地的SDP
call->setLocalSdp( new SipSdp( *localSdp ) );
deviceEvent->getSipStack()->sendReply( status );
}
else // 根據(jù)遠(yuǎn)端創(chuàng)建的本地的SDP為0的情況。
{
cpLog(LOG_DEBUG, "localSdp == 0");
// May not have SDP in original INVITE for 3rd party call control
SipSdp sdp;
b. RTP/RTCP部分的改造:
首先在現(xiàn)有的音頻RTP/RTCP會話基礎(chǔ)上增加一個視頻的RTP/RTCP會話,從前面介紹的我們知道視頻和音頻一般來說是不在一個RTP端口的,那么我們?yōu)榱诵麻_的視頻RTP端口當(dāng)然需要捆綁一個RTPSession(會話),在這里我們需要重寫視頻設(shè)備實例的ProcessRTP方法,換一句話來說,就是視頻和音頻設(shè)備有自己的ProcessRTP方法,分別從不同的端口進(jìn)程讀取相應(yīng)的媒體數(shù)據(jù)流,另外相對視頻信號而言,視頻流的RTP幀肯定相對要大一些,不過為了保證聲音/視頻同步,一般來說兩者的時長還是需要相等(一般是以20ms的數(shù)據(jù)幀,在這個時長內(nèi)聲音/視頻的RTP的頭和內(nèi)容的比例還是比較均勻的,不過這樣的話,要使用Jitter的方式,但是實際上,視頻/音頻的時間上并不能做到完全的相等,所以在聲/象同步上并不能完全依賴SSRC,需要在設(shè)計時采用同步緩沖的方式,大家有興趣的話可以參加一些RSVP工程組中有關(guān)于QoS改善的討論)。
c. 聲象同步:
任何一個商業(yè)成功的商業(yè)運作的視頻通訊軟件中都需要比較好的去解決聲象同步這
個重要的問題,我們一般建議采用的方式是建立FIFO隊列緩沖,根據(jù)RTP包的SSRC重新排列這些分組,不過如果在操作系統(tǒng)中采用了Direct X或者是直接讀寫FrameBuffer技術(shù)的話,那么FIFO也就不能達(dá)到您想直接提高圖象處理速度的能力.
a. RSVP上的改善:視頻通訊預(yù)留的帶寬要比原來音頻的要大很多了,而且我們必須考慮到H.261/263協(xié)議中的幀間幀(IntraFrame)的情況,會產(chǎn)生突發(fā)性的帶寬需求,所以預(yù)留帶寬需要比平均帶寬高30%左右,另外,對RESC/PATH消息對必須在通訊中周期性的傳送,確保證實帶寬(必須考慮消息對所占用的一定帶寬)。
b. RTP信道上的改善:我們通過RTCP中的SR/RR分組了解到了丟失率,累計分組數(shù),到達(dá)時延抖動等等QoS信息,我們可以通過這些信息對通訊終端的視頻信號進(jìn)行一定的控制,比如在發(fā)現(xiàn)QoS降低時,可以以降低量化度或單位時間幀數(shù)來降低帶寬負(fù)載。
參考文獻(xiàn):
RFC3261
RFC2548
RFC2205
RFC2212
RAPI -- An RSVP Application Programming Interface Version 5
Practical VOIP Using Vocal(O'REILLY)
IP Phone Based on IP network and Multimedia communication(WOS)
IP Phone in Internent(Oliver David)
IP網(wǎng)絡(luò)電話技術(shù)(人民郵電出版社)
視頻壓縮與視頻編碼技術(shù)(中國電力出版社)