關於jrtplib環境的建立,能夠見我曾經寫的總結,如今我主要來談談jrtplib3.71下的幾個example的學習。 一、sample是一個簡單的IPv4的列子,它實現了RTP在本機上的數據的傳輸。 1、初始化。我們知道RTP是一般是使用UDP協議來實現數據的傳輸,在windows環境下,當然要用到我們熟悉的套接字的使用,所以我們先要進行初始化,載入套接字庫。
函數RTPGetErrorString(…)依據出錯返回的一個負數來推斷,利用jrtplib採用的統一出錯機制返回的是一個C++中標准的字符串std::string,表示出錯的信息,比喻我們指定的Portbase不是一個偶數。(為什么,以下要講)
2、關於RTPSession對象設置
因為要使用套接字,故我們在使用之前一定要為我們的監聽socket指定一個監聽端口,也就是這里的portbase的值。我們能夠通過調用RTPSession的第二個參數RTPUDPv4TransmissionParams的成員函數來設定,
transparams.SetPortbase(portbase);
還有就是我們要通過RTPSession的第一個參數來設定以下一些值:
sessparams.SetOwnTimestampUnit(1.0/10.0);
//注意這個值我們一定要設置,The local timestamp unit MUST be set, otherwise
//RTCP Sender Report info will be calculated wrong, In this case, we'll be sending
//10 samples each second, so we'll put the timestamp unit to (1.0/10.0)
//設置時間戳是一件非常重要的事情,是RTP會話初始化過程所要進行的另外一項重要工
//作,他的單位是秒,如:當使用RTP會話傳輸8000Hz採樣的音頻數據時,因為時戳
//每秒鍾將遞增8000,所以時戳單元對應地應該被設置成1/8000:
sessparams.SetAcceptOwnPackets(true);
//通過這個函數我們能夠設置是不是接收我們自己定義的數據包。
3、數據發送
我想當我們要想建立連接的時候,我們就要讓發送端知道要發送到的主機的IP地址,在jrtplib中我們能夠通過RTPSession成員函數AddDestination()、DeleteDestination()和 ClearDestinations()來完畢。如以下是將數據發送給本機的6000號端口:
unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr, 6000);
當然我們還能夠這樣來完畢添�一個client,
RTPIPv4Address addr(destip,destport);//destip為clientIP地址,destport為client//端口號
status = sess.AddDestination(addr);
checkerror(status);
目標地址全部指定之后,接着就能夠調用RTPSession類的SendPacket()方法,向全部的目標地址發送流媒體數據。SendPacket()是RTPSession類提供的一個重載函數,它具有下列多種形式:
int SendPacket(void *data,int len)
int SendPacket(void *data,int len,unsigned char pt,bool mark,
unsigned long timestampinc)
int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,
int numhdrextwords)
int SendPacket(void *data,int len,unsigned char pt,bool mark,
unsigned long timestampinc,unsigned short hdrextID,
void *hdrextdata,int numhdrextwords)
SendPacket()最典型的使用方法是相似於以下的語句,當中第一個參數是要被發送的數據,而第二個參數則指明將要發送數據的長度,再往后依次是RTP負載類型、標識和時戳增量。例如以下所看到的:
status = sess.SendPacket((void *)"1234567890",10,0,false,10);
checkerror(status);
對於同一個RTP會話來講,負載類型、標識和時戳增量通常來講都是同樣的,JRTPLIB同意將它們設置為會話的默認參數,這是通過調用 RTPSession類的SetDefaultPayloadType()、SetDefaultMark()和 SetDefaultTimeStampIncrement()方法來完畢的。為RTP會話設置這些默認參數的優點是能夠簡化數據的發送,比如,假設為 RTP會話設置了默認參數:
session.SetDefaultPayloadType(96);//注意這個參數不能隨便設置,參考RFC3551
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
在設置了以上的值后,我們能夠這樣來發送數據:
status = sess.SendPacket((void *)"1234567890",10);
3、數據接收
對於流媒體數據的接收端,首先須要調用RTPSession類的PollData()方法來接收發送過來的RTP或者RTCP數據報。因為同一個 RTP會話中同意有多個參與者(源),你既能夠通過調用RTPSession類的GotoFirstSource()和GotoNextSource() 方法來遍歷全部的源,也能夠通過調用RTPSession類的GotoFirstSourceWithData()和 GotoNextSourceWithData()方法來遍歷那些攜帶有數據的源。在從RTP會話中檢測出有效的數據源之后,接下去就能夠調用 RTPSession類的GetNextPacket()方法從中抽取RTP數據報,當接收到的RTP數據報處理完之后,一定要記得及時釋放。以下的代碼示范了該怎樣對接收到的RTP數據報進行處理:
JRTPLIB為RTP數據報定義了三種接收模式,當中每種接收模式都詳細規定了哪些到達的RTP數據報將會被接受,而哪些到達的RTP數據報將會被拒絕。通過調用RTPSession類的SetReceiveMode()方法能夠設置下列這些接收模式:
① RECEIVEMODE_ALL 缺省的接收模式,全部到達的RTP數據報都將被接受;
② RECEIVEMODE_IGNORESOME 除了某些特定的發送者之外,全部到達的RTP數據報都將被接受,而被拒絕的發送者列表能夠通過調用AddToIgnoreList()、ClearIgnoreList() 和DeleteFromIgnoreList()方法來進行設置;
③ RECEIVEMODE_ACCEPTSOME 除了某些特定的發送者之外,全部到達的RTP數據報都將被拒絕,而被接受的發送者列表能夠通過調用AddToAcceptList ()、ClearAcceptList ()和eleteFromAcceptList方法來進行設置。
4、執行程序
在執行程序之前,我們要知道,這是基於UDP協議的數據報服務。我們的example1是在本機上實現的RTP傳輸,而且僅僅有一個RTPSession對象,所以我們的監聽和接收的port是同一個,所以此時我們的portBase要和我們添�到RTPSession對象中的client的port一致,如上面我們能夠都設置成6000.可是假設是在兩個線程中,我們就要注意了,serverport和客戶port一定不一樣,這也是主要的知識,用的時候要注意,多思考。