rtp程式設計(2)
半個菸頭
3.3 資料傳送
當rtp會話成功建立起來之後,接下去就可以開始進行流**資料的實時傳輸了。首先需要設定好資料傳送的目標位址,rtp協議允許同一會話存在多個目標位址,這可以通過呼叫rtpsession類的adddestination()、deletedestination()和cleardestinations()方法來完成。例如,下面的語句表示的是讓rtp會話將資料傳送到本地主機的6000埠:
unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.adddestination(addr, 6000);
目標位址全部指定之後,接著就可以呼叫rtpsession類的sendpacket()方法,向所有的目標位址傳送流**資料。sendpacket()是rtpsession類提供的乙個過載函式,它具有下列多種形式:
int sendpacket(void *data,int len)
int sendpacket(void *data,int len,unsigned char pt,boolmark,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,boolmark,unsigned long timestampinc,
unsignedshort hdrextid,void *hdrextdata,int numhdrextwords)
sendpacket()最典型的用法是類似於下面的語句,其中第乙個引數是要被傳送的資料,而第二個引數則指明將要傳送資料的長度,再往後依次是rtp負載型別、標識和時戳增量。
sess.sendpacket(buffer, 5, 0, false, 10);
對於同乙個rtp會話來講,負載型別、標識和時戳增量通常來講都是相同的,jrtplib允許將它們設定為會話的預設引數,這是通過呼叫rtpsession類的setdefaultpayloadtype()、setdefaultmark()和setdefaulttimestampincrement()方法來完成的。為rtp會話設定這些預設引數的好處是可以簡化資料的傳送,例如,如果為rtp會話設定了預設引數:
sess.setdefaultpayloadtype(0);
sess.setdefaultmark(false);
sess.setdefaulttimestampincrement(10);
之後在進行資料傳送時只需指明要傳送的資料及其長度就可以了:
sess.sendpacket(buffer, 5);
3.4 資料接收
對於流**資料的接收端,首先需要呼叫rtpsession類的polldata()方法來接收傳送過來的rtp或者rtcp資料報。由於同乙個rtp會話中允許有多個參與者(源),你既可以通過呼叫rtpsession類的gotofirstsource()和gotonextsource()方法來遍歷所有的源,也可以通過呼叫rtpsession類的gotofirstsourcewithdata()和gotonextsourcewithdata()方法來遍歷那些攜帶有資料的源。在從rtp會話中檢測出有效的資料來源之後,接下去就可以呼叫rtpsession類的getnextpacket()方法從中抽取rtp資料報,當接收到的rtp資料報處理完之後,一定要記得及時釋放。下面的**示範了該如何對接收到的rtp資料報進行處理:
if (sess.gotofirstsourcewithdata()) while (sess.gotonextsourcewithdata());
}jrtplib為rtp資料報定義了三種接收模式,其中每種接收模式都具體規定了哪些到達的rtp資料報將會被接受,而哪些到達的rtp資料報將會被拒絕。通過呼叫rtpsession類的setreceivemode()方法可以設定下列這些接收模式:
receivemode_all 預設的接收模式,所有到達的rtp資料報都將被接受;
receivemode_ignoresome 除了某些特定的傳送者之外,所有到達的rtp資料報都將被接受,而被拒絕的傳送者列表可以通過呼叫addtoignorelist()、deletefromignorelist()和clearignorelist()方法來進行設定;
receivemode_acceptsome 除了某些特定的傳送者之外,所有到達的rtp資料報都將被拒絕,而被接受的傳送者列表可以通過呼叫addtoacceptlist()、deletefromacceptlist和clearacceptlist ()方法來進行設定。
3.5 控制資訊
jrtplib是乙個高度封裝後的rtp庫,程式設計師在使用它時很多時候並不用關心rtcp資料報是如何被傳送和接收的,因為這些都可以由jrtplib自己來完成。只要polldata()或者sendpacket()方法被成功呼叫,jrtplib就能夠自動對到達的rtcp資料報進行處理,並且還會在需要的時候傳送rtcp資料報,從而能夠確保整個rtp會話過程的正確性。
sess.setlocalemail("[email protected]@linuxgam.com
",19);
在rtp會話過程中,不是所有的控制資訊都需要被傳送,通過呼叫rtpsession類提供的enablesendname()、enablesendemail()、enablesendlocation()、enablesendphone()、enablesendtool()和enablesendnote()方法,可以為當前rtp會話選擇將被傳送的控制資訊。
3.6 實際應用
#include
#include
#include "rtpsession.h"
// 錯誤處理函式
void checkerror(int err)
}int main(int argc, char** argv)
// 獲得接收端的ip位址和埠號
destip = inet_addr(argv[1]);
if (destip == inaddr_none)
destip = ntohl(destip);
destport = atoi(argv[2]);
// 建立rtp會話
status = sess.create(portbase);
checkerror(status);
// 指定rtp資料接收端
status = sess.adddestination(destip,destport);
checkerror(status);
// 設定rtp會話預設引數
sess.setdefaultpayloadtype(0);
sess.setdefaultmark(false);
sess.setdefaulttimestampincrement(10);
// 傳送流**資料
index = 1;
do while(1);
return 0;
}清單4則給出了資料接收端的完整**,它負責從指定的埠不斷地讀取rtp資料報:
#include
#include "rtpsession.h"
#include "rtppacket.h"
// 錯誤處理函式
void checkerror(int err)
}int main(int argc, char** argv)
//獲得使用者指定的埠號
localport = atoi(argv[1]);
// 建立rtp會話
status = sess.create(localport);
checkerror(status);
do } while (sess.gotonextsourcewithdata());
} } while(1);
return 0;}
RTP程式設計
1 初始化 在使用 jrtplib 進行實時流 資料傳輸之前,首先應該生成 rtpsession 類的乙個例項來表示此次 rtp 會話。然後呼叫 create 方法來對其進行初始化操作 rtpsessionparams sessparams rtpudpv4transmissionparams tr...
Linux下RTP程式設計
順序流傳輸 實時流傳輸 實時傳輸協議 real time transport protocol,prt 是在internet上處理多 資料流的一種網路協議,利用它能夠在一對一 unicast,單播 或者一對多 multicast,多播 的網路環境中實現傳流 資料的實時傳輸。rtp通常使用udp來進行...
linux網路程式設計之RTP協議
以下內容取自 本機通訊 協議傳輸 協議傳輸 非本機 關於伺服器ip的傳輸方法 其中的python檔案用於獲取到rtp協議的字段的值,vlc上的流設定 根據獲取到的值來為c程式設計中模擬rtp協議頭 80解析為1000 0000,也就是v 10 也就是值為2 p 0,x 0,cc 0。第四列為遞增的,...