锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
RTP 鏄洰鍓嶈В鍐蟲祦濯掍綋瀹炴椂浼犺緭闂鐨勬渶濂藉姙娉曪紝瑕佸湪 Linux 騫沖彴涓婅繘琛屽疄鏃朵紶閫佺紪紼嬶紝鍙互鑰冭檻浣跨敤涓浜涘紑鏀炬簮浠g爜鐨?nbsp;RTP 搴擄紝濡?nbsp;LIBRTP銆丣RTPLIB 絳夈侸RTPLIB 鏄竴涓潰鍚戝璞$殑 RTP 搴擄紝瀹冨畬鍏ㄩ伒寰?nbsp;RFC 1889 璁捐錛屽湪寰堝鍦哄悎涓嬫槸涓涓潪甯鎬笉閿欑殑閫夋嫨銆侸RTPLIB 鏄竴涓敤 C++ 璇█瀹炵幇鐨?nbsp;RTP 搴擄紝榪欎釜搴撲嬌鐢╯ocket 鏈哄埗瀹炵幇緗戠粶閫氳 鍥犳鍙互榪愯鍦?nbsp;Windows銆丩inux銆丗reeBSD銆丼olaris銆乁nix鍜孷xWorks 絳夊縐嶆搷浣滅郴緇熶笂銆?br>浜屻丣RTPLIB 搴撶殑浣跨敤鏂規硶鍙婄▼搴忓疄鐜?br> (1)JRTPLIB 鍑芥暟 鐨勪嬌鐢?br> a銆佸湪浣跨敤 JRTPLIB 榪涜瀹炴椂嫻佸獟浣撴暟鎹紶杈撲箣鍓嶏紝棣栧厛搴旇鐢熸垚 RTPSession 綾葷殑涓涓疄渚嬫潵琛ㄧず姝ゆ RTP 浼氳瘽錛岀劧鍚庤皟鐢?nbsp;Create() 鏂規硶鏉ュ鍏惰繘琛屽垵濮嬪寲鎿嶄綔銆俁TPSession 綾葷殑 Create() 鏂規硶鍙湁涓涓弬鏁幫紝鐢ㄦ潵鎸囨槑姝ゆ RTP 浼氳瘽鎵閲囩敤鐨勭鍙e彿銆?br> RTPSession sess; sess.Create(5000);
b銆佽緗伆褰撶殑鏃舵埑鍗曞厓錛屾槸 RTP 浼氳瘽鍒濆鍖栬繃紼嬫墍瑕佽繘琛岀殑鍙﹀涓欏歸噸瑕佸伐浣滐紝榪欐槸閫氳繃璋冪敤 RTPSession 綾葷殑 SetTimestampUnit() 鏂規硶鏉ュ疄鐜扮殑錛岃鏂規硶鍚屾牱涔熷彧鏈変竴涓弬鏁幫紝琛ㄧず鐨勬槸浠ョ涓哄崟鍏冪殑鏃舵埑鍗曞厓銆?br> sess.SetTimestampUnit(1.0/8000.0);
c銆佸綋 RTP 浼氳瘽鎴愬姛寤虹珛璧鋒潵涔嬪悗錛屾帴涓嬪幓灝卞彲浠ュ紑濮嬭繘琛屾祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撲簡銆傞鍏堥渶瑕佽緗ソ鏁版嵁鍙戦佺殑鐩爣鍦板潃錛孯TP 鍗忚鍏佽鍚屼竴浼氳瘽瀛樺湪澶氫釜鐩爣鍦板潃錛岃繖鍙互閫氳繃璋冪敤 RTPSession 綾葷殑 AddDestination()銆丏eleteDestination() 鍜?nbsp;ClearDestinations() 鏂規硶鏉ュ畬鎴愩備緥濡傦紝涓嬮潰鐨勮鍙ヨ〃紺虹殑鏄 RTP 浼氳瘽灝嗘暟鎹彂閫佸埌鏈湴涓繪満鐨?nbsp;6000 绔彛錛?nbsp;
unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr, 6000);
d銆佺洰鏍囧湴鍧鍏ㄩ儴鎸囧畾涔嬪悗錛屾帴鐫灝卞彲浠ヨ皟鐢?nbsp;RTPSession 綾葷殑 SendPacket() 鏂規硶錛屽悜鎵鏈夌殑鐩爣鍦板潃鍙戦佹祦濯掍綋鏁版嵁銆係endPacket() 鏄?nbsp;RTPSession 綾繪彁渚涚殑涓涓噸杞藉嚱鏁?br>瀵逛簬鍚屼竴涓?nbsp;RTP 浼氳瘽鏉ヨ錛岃礋杞界被鍨嬨佹爣璇嗗拰鏃舵埑澧為噺閫氬父鏉ヨ閮芥槸鐩稿悓鐨勶紝JRTPLIB 鍏佽灝嗗畠浠緗負浼氳瘽鐨勯粯璁ゅ弬鏁幫紝榪欐槸閫氳繃璋冪敤 RTPSession 綾葷殑 SetDefaultPayloadType()銆丼etDefaultMark() 鍜?nbsp;SetDefaultTimeStampIncrement() 鏂規硶鏉ュ畬鎴愮殑銆備負 RTP 浼氳瘽璁劇疆榪欎簺榛樿鍙傛暟鐨勫ソ澶勬槸鍙互綆鍖栨暟鎹殑鍙戦侊紝渚嬪錛屽鏋滀負 RTP 浼氳瘽璁劇疆浜嗛粯璁ゅ弬鏁幫細
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
涔嬪悗鍦ㄨ繘琛屾暟鎹彂閫佹椂鍙渶鎸囨槑瑕佸彂閫佺殑鏁版嵁鍙婂叾闀垮害灝卞彲浠ヤ簡錛?nbsp;
sess.SendPacket(buffer, 5);
e銆佸浜庢祦濯掍綋鏁版嵁鐨勬帴鏀剁錛岄鍏堥渶瑕佽皟鐢?nbsp;RTPSession 綾葷殑 PollData() 鏂規硶鏉ユ帴鏀跺彂閫佽繃鏉ョ殑 RTP 鎴栬?nbsp;RTCP 鏁版嵁鎶ャ傜敱浜庡悓涓涓?nbsp;RTP 浼氳瘽涓厑璁告湁澶氫釜鍙備笌鑰咃紙婧愶級錛屼綘鏃㈠彲浠ラ氳繃璋冪敤 RTPSession 綾葷殑 GotoFirstSource() 鍜?nbsp;GotoNextSource() 鏂規硶鏉ラ亶鍘嗘墍鏈夌殑婧愶紝涔熷彲浠ラ氳繃璋冪敤 RTPSession 綾葷殑 GotoFirstSourceWithData() 鍜?nbsp;GotoNextSourceWithData() 鏂規硶鏉ラ亶鍘嗛偅浜涙惡甯︽湁鏁版嵁鐨勬簮銆傚湪浠?nbsp;RTP 浼氳瘽涓嫻嬪嚭鏈夋晥鐨勬暟鎹簮涔嬪悗錛屾帴涓嬪幓灝卞彲浠ヨ皟鐢?nbsp;RTPSession 綾葷殑 GetNextPacket() 鏂規硶浠庝腑鎶藉彇 RTP 鏁版嵁鎶ワ紝褰撴帴鏀跺埌鐨?nbsp;RTP 鏁版嵁鎶ュ鐞嗗畬涔嬪悗錛屼竴瀹氳璁板緱鍙婃椂閲婃斁銆?br>
JRTPLIB 涓?nbsp;RTP 鏁版嵁鎶ュ畾涔変簡涓夌鎺ユ敹妯″紡錛屽叾涓瘡縐嶆帴鏀舵ā寮忛兘鍏蜂綋瑙勫畾浜嗗摢浜涘埌杈劇殑 RTP 鏁版嵁鎶ュ皢浼氳鎺ュ彈錛岃屽摢浜涘埌杈劇殑 RTP 鏁版嵁鎶ュ皢浼氳鎷掔粷銆傞氳繃璋冪敤 RTPSession 綾葷殑 SetReceiveMode() 鏂規硶鍙互璁劇疆涓嬪垪榪欎簺鎺ユ敹妯″紡錛?nbsp;
? RECEIVEMODE_ALL銆銆緙虹渷鐨勬帴鏀舵ā寮忥紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎺ュ彈錛?nbsp;
? RECEIVEMODE_IGNORESOME銆銆闄や簡鏌愪簺鐗瑰畾鐨勫彂閫佽呬箣澶栵紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎺ュ彈錛岃岃鎷掔粷鐨勫彂閫佽呭垪琛ㄥ彲浠ラ氳繃璋冪敤 AddToIgnoreList()銆丏eleteFromIgnoreList() 鍜?nbsp;ClearIgnoreList() 鏂規硶鏉ヨ繘琛岃緗紱
? RECEIVEMODE_ACCEPTSOME銆銆闄や簡鏌愪簺鐗瑰畾鐨勫彂閫佽呬箣澶栵紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎷掔粷錛岃岃鎺ュ彈鐨勫彂閫佽呭垪琛ㄥ彲浠ラ氳繃璋冪敤 AddToAcceptList ()銆丏eleteFromAcceptList 鍜?nbsp;ClearAcceptList () 鏂規硶鏉ヨ繘琛岃緗?nbsp;涓嬮潰鏄噰鐢ㄧ涓夌鎺ユ敹妯″紡鐨勭▼搴忕ず渚嬨?br> if (sess.GotoFirstSourceWithData()) {
do {
sess.AddToAcceptList(remoteIP, allports,portbase);
sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
RTPPacket *pack;
pack = sess.GetNextPacket(); // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁
delete pack; }
while (sess.GotoNextSourceWithData());
}
錛?錛夌▼搴忔祦紼嬪浘
鍙戦侊細鑾峰緱鎺ユ敹绔殑 IP 鍦板潃鍜岀鍙e彿 鍒涘緩 RTP 浼氳瘽 鎸囧畾 RTP 鏁版嵁鎺ユ敹绔?nbsp;璁劇疆 RTP 浼氳瘽榛樿鍙傛暟 鍙戦佹祦濯掍綋鏁版嵁
鎺ユ敹錛氳幏寰楃敤鎴鋒寚瀹氱殑绔彛鍙?nbsp; 鍒涘緩RTP浼氳瘽 璁劇疆鎺ユ敹妯″紡 鎺ュ彈RTP鏁版嵁 媯绱TP鏁版嵁婧?nbsp; 鑾峰彇RTP鏁版嵁鎶?nbsp; 鍒犻櫎RTP鏁版嵁鎶?br>
涓夈佺幆澧冩惌寤哄強緙栬瘧鏂規硶
錛?錛塗oolchain鐨勫畨瑁?br> 棣栧厛鎵懼埌xscale-arm-toolchain.tgz鏂囦歡錛屽亣璁捐鏂囦歡鍖呮斁鍦?tmp/涓?br> #cd /
#tar -zxvf /tmp/xscale-arm-toolchain.tgz
鍐嶈緗幆澧冨彉閲?br> #export PATH=/usr/local/arm-linux/bin:$PATH
鏈鍚庢鏌ヤ竴涓嬩氦鍙夌紪璇戝伐鍏鋒槸鍚﹀畨瑁呮垚鍔?br> #arm-linux-g++ --version
鐪嬫槸鍚︽樉紺篴rm-linux-g++鐨勭増鏈紝濡傛湁鍒欏畨瑁呮垚鍔熴?br>錛?錛塉RTPLIB 搴撶殑浜ゅ弶緙栬瘧鍙婂畨瑁?br> 棣栧厛浠?nbsp;JRTPLIB 鐨勭綉绔欙紙
http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.htmll錛?nbsp;涓嬭澆鏈鏂扮殑婧愮爜鍖咃紝姝ゅ浣跨敤鐨勬槸jrtplib-2.8.tar錛屽亣璁句笅杞藉悗鐨勬簮鐮佸寘鏀懼湪/tmp涓嬶紝鎵?nbsp;琛屼笅闈㈢殑鍛戒護瀵瑰叾瑙e帇緙╋細
#cd /tmp
#tar -zxvf jrtplib-2.8.tar
鐒跺悗瑕佸jrtplib榪涜閰嶇疆鍜岀紪璇?br> #cd jrtplib-2.8
#./configure CC=arm-linux-g++ cross-compile=yes
淇敼Makefile鏂囦歡
灝嗛摼鎺ュ懡浠d 鍜宎r鏀逛負arm-linux-ld鍜?nbsp;arm-linux-ar
#make
鏈鍚庡啀鎵ц濡備笅鍛戒護灝卞彲浠ュ畬鎴?nbsp;JRTPLIB 鐨勫畨瑁咃細
#make install
(3)紼嬪簭緙栬瘧
a銆侀厤緗紪璇戠幆澧?br> 鍙互鐢╡xport鏉ラ厤緗紝涔熷彲浠ョ敤緙栧啓Makefile鐨勬柟娉曘傝繖閲岄噰鐢∕akefile銆?br> 緙栧啓Makefile&:
INCL = -I/usr/local/include
CFLAGS = -pipe -O2 -fno-strength-reduce
LFLAGS = /usr/local/lib/libjrtp.a -L/usr/X11R6/lib
LIBS = -LX11 -LXext /usr/local/lib/libjrtp.a
CC = arm-linux-g++
main:main.o
$(CC) $(LFLAGS) $(INCL) -o main main.o $(LIBS)
main.o:main.cpp
clean:
rm -f main
rm -f *.o
.SUFFIXES:.cpp
.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $< /* $@琛ㄧず鐩爣鐨勫畬鏁村悕瀛?nbsp; */
/* $<琛ㄧず絎竴涓緷璧栨枃浠剁殑鍚嶅瓧 */
b銆佺紪璇?br> 鍋囪鍙戦佸拰鎺ユ敹紼嬪簭鍒嗗埆鏀懼湪/tmp/send鍜?tmp/receive鐩綍涓?br> #cd /tmp/send
#make
#cd /tmp/receive
#make
鍥涖佹槗鍑洪敊璇強娉ㄦ剰闂
1銆佹壘涓嶅埌涓浜涙爣鍑嗙殑鏈 鍩烘湰鐨勪竴浜涘ご鏂囦歡銆?br> 涓昏鏄洜涓篢oolchain璺緞娌″畨瑁呭錛岃 涓ユ牸鎸夌収姝ラ瀹夎銆?br> 2銆佹壘涓嶅埌浣跨敤鐨刯rtplib搴撲腑鐨勪竴浜涘ご鏂囦歡銆?br> 鍦?nbsp;jrtplib鐨勫畨瑁呯洰褰曚笅錛宨nclude璺緞涓嬩笉鑳藉啀鏈夊埆鐨勭洰褰曘?br> 3銆乺ecieve鍑芥暟鎺ユ敹鏁版嵁鍖呬笉鑳芥紜彁鍑烘墍瑕佹暟鎹?br> 鐢變簬姣忎竴涓猂TP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛圥ayload錛変袱涓儴鍒嗙粍鎴愶紝鑻ヤ嬌鐢╣etrawdata()鏄繑鍥炴暣涓暟鎹寘鐨勬暟鎹紝鍖呭惈浼犺緭濯掍綋鐨勭被鍨嬨佹牸寮忋佸簭鍒楀彿銆佹椂闂存埑浠ュ強鏄惁鏈夐檮鍔犳暟鎹瓑淇℃伅銆俫etpayload()鍑芥暟鏄繑鍥炴墍鍙戦佺殑鏁版嵁銆備袱鑰呬竴瀹氳鍒嗘竻銆?br> 4銆佽緗甊ECEIVEMODE_ACCEPTSOME銆銆鎺ユ敹妯″紡鍚庯紝榪愯紼嬪簭鎺ユ敹绔笉鑳芥帴鍖呫?br> IP鍦板潃鏍煎紡鍑轟簡闂銆俰ner_addr()涓巒tohl()鍑芥暟瑕佺敤瀵癸紝鍚﹀垯鍙傛暟浼犱笉榪涘幓錛屾帴鍙楀垪琛ㄤ腑鏃犲鹼紝褰撶劧鎺ユ敹涓嶄簡鏁版嵁鍖呫?br> 5銆佺紪璇戦氳繃錛屼絾嫻嬭瘯鏃舵帴鏀剁涓嶈兘鎺ユ敹鍒版暟鎹?br> 鍙兘鏄帴鏀舵満闃茬伀澧欐湭鍏抽棴銆傝繍琛岋細
#iptables -F
涔熷彲鑳芥槸IP鍦板潃娌℃湁璁劇疆濂姐傝繍琛岋細
#ifocnfig eth0 *.*.*.* netmask *.*.*.*
6銆佷嬌鐢╦rtolib搴撴椂錛屽湪紼嬪簭涓璱nclude 鍚庢渶濂藉姞涓婂簱鎵鍦ㄧ殑璺緞銆?br>浜斻佺▼搴?br>
send:
#include <stdio.h>
#include <string.h>
#include "rtpsession.h"
// 閿欒澶勭悊鍑芥暟
void checkerror(int err)
{
if (err < 0) {
char* errstr = RTPGetErrorString(err);
printf("Error:%s\\n", errstr);
exit(-1);
}
}
int main(int argc, char** argv)
{
RTPSession sess;
unsigned long destip;
int destport;
int portbase = 6000;
int status, index;
char buffer[128];
if (argc != 3) {
printf("Usage: ./sender destip destport\\n");
return -1;
}
// 鑾峰緱鎺ユ敹绔殑IP鍦板潃鍜岀鍙e彿
destip = inet_addr(argv[1]);
if (destip == INADDR_NONE) {
printf("Bad IP address specified.\\n");
return -1;
}
destip = ntohl(destip);
destport = atoi(argv[2]);
// 鍒涘緩RTP浼氳瘽
status = sess.Create(portbase);
checkerror(status);
// 鎸囧畾RTP鏁版嵁鎺ユ敹绔?br> status = sess.AddDestination(destip, destport);
checkerror(status);
// 璁劇疆RTP浼氳瘽榛樿鍙傛暟
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
// 鍙戦佹祦濯掍綋鏁版嵁
index = 1;
do {
sprintf(buffer, "%d: RTP packet", index ++);
sess.SendPacket(buffer, strlen(buffer));
printf("Send packet !\\n");
} while(1);
return 0;
}
receive:
#include <stdio.h>
#include "rtpsession.h"
#include "rtppacket.h"
// 閿欒澶勭悊鍑芥暟
void checkerror(int err)
{
if (err < 0) {
char* errstr = RTPGetErrorString(err);
printf("Error:%s\\n", errstr);
exit(-1);
}
}
int main(int argc, char** argv)
{
RTPSession sess;
int localport,portbase;
int status;
unsigned long remoteIP;
if (argc != 4) {
printf("Usage: ./sender localport\\n");
return -1;
}
// 鑾峰緱鐢ㄦ埛鎸囧畾鐨勭鍙e彿
remoteIP = inet_addr(argv[1]);
localport = atoi(argv[2]);
portbase = atoi(argv[3]);
// 鍒涘緩RTP浼氳瘽
status = sess.Create(localport);
checkerror(status);
//RTPHeader *rtphdr;
unsigned long timestamp1;
unsigned char * RawData;
unsigned char temp[30];
int lengh ,i;
bool allports = 1;
sess.AddToAcceptList(remoteIP, allports,portbase);
do {
//璁劇疆鎺ユ敹妯″紡
sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
sess.AddToAcceptList(remoteIP, allports,portbase);
// 鎺ュ彈RTP鏁版嵁
status = sess.PollData();
// 媯绱TP鏁版嵁婧?br> if (sess.GotoFirstSourceWithData()) {
do {
RTPPacket* packet;
// 鑾峰彇RTP鏁版嵁鎶?br> while ((packet = sess.GetNextPacket()) != NULL) {
printf("Got packet !\n");
timestamp1 = packet->GetTimeStamp();
lengh=packet->GetPayloadLength();
RawData=packet->GetPayload();
for(i=0;i<lengh;i++){
temp[i]=RawData[i];
printf("%c",temp[i]);
}
temp[i]='\0';
printf(" timestamp: %d lengh=%d data:%s\n",timestamp1,lengh,&temp);
// 鍒犻櫎RTP鏁版嵁鎶?br>
delete packet;
}
} while (sess.GotoNextSourceWithData());
}
} while(1);
return 0;
}
]]>
涓銆佹祦濯掍綋綆浠?/span>
闅忕潃Internet鐨勬棩鐩婃櫘鍙婏紝鍦ㄧ綉緇滀笂浼犺緭鐨勬暟鎹凡緇忎笉鍐嶅眬闄愪簬鏂囧瓧鍜屽浘褰紝鑰屾槸閫愭笎鍚戝0闊沖拰瑙嗛絳夊濯掍綋鏍煎紡榪囨浮銆傜洰鍓嶅湪緗戠粶涓婁紶杈撻煶棰?span>/瑙嗛錛?span>Audio/Video錛岀畝縐?span>A/V錛夌瓑澶氬獟浣撴枃浠舵椂錛屽熀鏈笂鍙湁涓嬭澆鍜屾祦寮忎紶杈撲袱縐嶉夋嫨銆傞氬父璇存潵錛?span>A/V鏂囦歡鍗犳嵁鐨勫瓨鍌ㄧ┖闂撮兘姣旇緝澶э紝鍦ㄥ甫瀹藉彈闄愮殑緗戠粶鐜涓笅杞藉彲鑳借鑰楄垂鏁板垎閽熺敋鑷蟲暟灝忔椂錛屾墍浠ヨ繖縐嶅鐞嗘柟娉曠殑寤惰繜寰堝ぇ銆傚鏋滄崲鐢ㄦ祦寮忎紶杈撶殑璇濓紝澹伴煶銆佸獎鍍忋佸姩鐢葷瓑澶氬獟浣撴枃浠跺皢鐢變笓闂ㄧ殑嫻佸獟浣撴湇鍔″櫒璐熻矗鍚戠敤鎴瘋繛緇佸疄鏃跺湴鍙戦侊紝榪欐牱鐢ㄦ埛鍙互涓嶅繀絳夊埌鏁翠釜鏂囦歡鍏ㄩ儴涓嬭澆瀹屾瘯錛岃屽彧闇瑕佺粡榪囧嚑縐掗挓鐨勫惎鍔ㄥ歡鏃跺氨鍙互浜嗭紝褰撹繖浜涘濯掍綋鏁版嵁鍦ㄥ鎴鋒満涓婃挱鏀炬椂錛屾枃浠剁殑鍓╀綑閮ㄥ垎灝嗙戶緇粠嫻佸獟浣撴湇鍔″櫒涓嬭澆銆?/span>
嫻侊紙Streaming錛夋槸榪戝勾鍦?span>Internet涓婂嚭鐜扮殑鏂版蹇碉紝鍏跺畾涔夐潪甯稿箍娉涳紝涓昏鏄寚閫氳繃緗戠粶浼犺緭澶氬獟浣撴暟鎹殑鎶鏈葷О銆傛祦濯掍綋鍖呭惈騫夸箟鍜岀嫮涔変袱縐嶅唴娑碉細騫夸箟涓婄殑嫻佸獟浣撴寚鐨勬槸浣塊煶棰戝拰瑙嗛褰㈡垚紼沖畾鍜岃繛緇殑浼犺緭嫻佸拰鍥炴斁嫻佺殑涓緋誨垪鎶鏈佹柟娉曞拰鍗忚鐨勬葷О錛屽嵆嫻佸獟浣撴妧鏈紱鐙箟涓婄殑嫻佸獟浣撴槸鐩稿浜庝紶緇熺殑涓嬭澆-鍥炴斁鏂瑰紡鑰岃█鐨勶紝鎸囩殑鏄竴縐嶄粠Internet涓婅幏鍙栭煶棰戝拰瑙嗛絳夊濯掍綋鏁版嵁鐨勬柊鏂規硶錛屽畠鑳藉鏀寔澶氬獟浣撴暟鎹祦鐨勫疄鏃朵紶杈撳拰瀹炴椂鎾斁銆傞氳繃榪愮敤嫻佸獟浣撴妧鏈紝鏈嶅姟鍣ㄨ兘澶熷悜瀹㈡埛鏈哄彂閫佺ǔ瀹氬拰榪炵畫鐨勫濯掍綋鏁版嵁嫻侊紝瀹㈡埛鏈哄湪鎺ユ敹鏁版嵁鐨勫悓鏃朵互涓涓ǔ瀹氱殑閫熺巼鍥炴斁錛岃屼笉鐢ㄧ瓑鏁版嵁鍏ㄩ儴涓嬭澆瀹屼箣鍚庡啀榪涜鍥炴斁銆?/span>
鐢變簬鍙楃綉緇滃甫瀹姐佽綆楁満澶勭悊鑳藉姏鍜屽崗璁鑼冪瓑鏂歸潰鐨勯檺鍒訛紝瑕佹兂浠?span>Internet涓婁笅杞藉ぇ閲忕殑闊抽鍜岃棰戞暟鎹紝鏃犺浠庝笅杞芥椂闂村拰瀛樺偍絀洪棿涓婃潵璁查兘鏄笉澶幇瀹炵殑錛岃屾祦濯掍綋鎶鏈殑鍑虹幇鍒欏緢濂藉湴瑙e喅浜嗚繖涓闅鵑銆傜洰鍓嶅疄鐜版祦濯掍綋浼犺緭涓昏鏈変袱縐嶆柟娉曪細欏哄簭嫻侊紙progressive streaming錛変紶杈撳拰瀹炴椂嫻侊紙realtime streaming錛変紶杈擄紝瀹冧滑鍒嗗埆閫傚悎浜庝笉鍚岀殑搴旂敤鍦哄悎銆?/span>
欏哄簭嫻佷紶杈?/span>
欏哄簭嫻佷紶杈撻噰鐢ㄩ『搴忎笅杞界殑鏂瑰紡榪涜浼犺緭錛屽湪涓嬭澆鐨勫悓鏃剁敤鎴峰彲浠ュ湪綰垮洖鏀懼濯掍綋鏁版嵁錛屼絾緇欏畾鏃跺埢鍙兘瑙傜湅宸茬粡涓嬭澆鐨勯儴鍒嗭紝涓嶈兘璺沖埌灝氭湭涓嬭澆鐨勯儴鍒嗭紝涔熶笉鑳藉湪浼犺緭鏈熼棿鏍規嵁緗戠粶鐘跺喌瀵逛笅杞介熷害榪涜璋冩暣銆傜敱浜庢爣鍑嗙殑HTTP鏈嶅姟鍣ㄥ氨鍙互鍙戦佽繖縐嶅艦寮忕殑嫻佸獟浣擄紝鑰屼笉闇瑕佸叾浠栫壒孌婂崗璁殑鏀寔錛屽洜姝や篃甯稿父琚О浣?span>HTTP 嫻佸紡浼犺緭銆傞『搴忔祦寮忎紶杈撴瘮杈冮傚悎浜庨珮璐ㄩ噺鐨勫濯掍綋鐗囨錛屽鐗囧ご銆佺墖灝炬垨鑰呭箍鍛婄瓑銆?/span>
瀹炴椂嫻佷紶杈?/span>
瀹炴椂嫻佸紡浼犺緭淇濊瘉濯掍綋淇″彿甯﹀鑳藉涓庡綋鍓嶇綉緇滅姸鍐電浉鍖歸厤錛屼粠鑰屼嬌寰楁祦濯掍綋鏁版嵁鎬繪槸琚疄鏃跺湴浼犻侊紝鍥犳鐗瑰埆閫傚悎浜庣幇鍦轟簨浠躲傚疄鏃舵祦浼犺緭鏀寔闅忔満璁塊棶錛屽嵆鐢ㄦ埛鍙互閫氳繃蹇繘鎴栬呭悗閫鎿嶄綔鏉ヨ鐪嬪墠闈㈡垨鑰呭悗闈㈢殑鍐呭銆備粠鐞嗚涓婅錛屽疄鏃舵祦濯掍綋涓緇忔挱鏀懼氨涓嶄細鍋滈】錛屼絾浜嬪疄涓婁粛鏈夊彲鑳藉彂鐢熷懆鏈熸х殑鏆傚仠鐜拌薄錛屽挨鍏舵槸鍦ㄧ綉緇滅姸鍐墊伓鍖栨椂鏇存槸濡傛銆備笌欏哄簭嫻佷紶杈撲笉鍚岀殑鏄紝瀹炴椂嫻佷紶杈撻渶瑕佺敤鍒扮壒瀹氱殑嫻佸獟浣撴湇鍔″櫒錛岃屼笖榪橀渶瑕佺壒瀹氱綉緇滃崗璁殑鏀寔銆?/span>
浜屻佹祦濯掍綋鍗忚
瀹炴椂浼犺緭鍗忚錛?span>Real-time Transport Protocol錛?span>PRT錛夋槸鍦?span>Internet涓婂鐞嗗濯掍綋鏁版嵁嫻佺殑涓縐嶇綉緇滃崗璁紝鍒╃敤瀹冭兘澶熷湪涓瀵逛竴錛?span>unicast錛屽崟鎾級鎴栬呬竴瀵瑰錛?span>multicast錛屽鎾級鐨勭綉緇滅幆澧冧腑瀹炵幇浼犳祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撱?span>RTP閫氬父浣跨敤UDP鏉ヨ繘琛屽濯掍綋鏁版嵁鐨勪紶杈擄紝浣嗗鏋滈渶瑕佺殑璇濆彲浠ヤ嬌鐢?span>TCP鎴栬?span> ATM絳夊叾瀹冨崗璁紝鏁翠釜RTP鍗忚鐢變袱涓瘑鍒囩浉鍏崇殑閮ㄥ垎緇勬垚錛?span>RTP鏁版嵁鍗忚鍜?span>RTP鎺у埗鍗忚銆傚疄鏃舵祦鍗忚錛?span>Real Time Streaming Protocol錛?span>RTSP錛夋渶鏃╃敱Real Networks鍜?span>Netscape鍏徃鍏卞悓鎻愬嚭錛屽畠浣嶄簬RTP鍜?span>RTCP涔嬩笂錛屽叾鐩殑鏄笇鏈涢氳繃IP緗戠粶鏈夋晥鍦頒紶杈撳濯掍綋鏁版嵁銆?/span>
2.1 RTP鏁版嵁鍗忚
RTP鏁版嵁鍗忚璐熻矗瀵規祦濯掍綋鏁版嵁榪涜灝佸寘騫跺疄鐜板獟浣撴祦鐨勫疄鏃朵紶杈擄紝姣忎竴涓?span>RTP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛?span>Payload錛変袱涓儴鍒嗙粍鎴愶紝鍏朵腑澶撮儴鍓?span>12涓瓧鑺傜殑鍚箟鏄浐瀹氱殑錛岃岃礋杞藉垯鍙互鏄煶棰戞垨鑰呰棰戞暟鎹?span>RTP鏁版嵁鎶ョ殑澶撮儴鏍煎紡濡傚浘1鎵紺猴細

鍏朵腑姣旇緝閲嶈鐨勫嚑涓煙鍙婂叾鎰忎箟濡備笅錛?nbsp;
浠?span>RTP 鏁版嵁鎶ョ殑鏍煎紡涓嶉毦鐪嬪嚭錛屽畠鍖呭惈浜嗕紶杈撳獟浣撶殑綾誨瀷銆佹牸寮忋佸簭鍒楀彿銆佹椂闂存埑浠ュ強鏄惁鏈夐檮鍔犳暟鎹瓑淇℃伅錛岃繖浜涢兘涓哄疄鏃剁殑嫻佸獟浣撲紶杈撴彁渚涗簡鐩稿簲鐨勫熀紜銆?span>RTP鍗忚鐨勭洰鐨勬槸鎻愪緵瀹炴椂鏁版嵁錛堝浜や簰寮忕殑闊抽鍜岃棰戯級鐨勭鍒扮浼犺緭鏈嶅姟錛屽洜姝ゅ湪RTP涓病鏈夎繛鎺ョ殑姒傚康錛屽畠鍙互寤虹珛鍦ㄥ簳灞傜殑闈㈠悜榪炴帴鎴栭潰鍚戦潪榪炴帴鐨勪紶杈撳崗璁箣涓婏紱RTP涔熶笉渚濊禆浜庣壒鍒殑緗戠粶鍦板潃鏍煎紡錛岃屼粎浠呭彧闇瑕佸簳灞備紶杈撳崗璁敮鎸佺粍甯э紙Framing錛夊拰鍒嗘錛?span>Segmentation錛夊氨瓚沖浜嗭紱鍙﹀RTP 鏈韓榪樹笉鎻愪緵浠諱綍鍙潬鎬ф満鍒訛紝榪欎簺閮借鐢變紶杈撳崗璁垨鑰呭簲鐢ㄧ▼搴忚嚜宸辨潵淇濊瘉銆傚湪鍏稿瀷鐨勫簲鐢ㄥ満鍚堜笅錛?span>RTP 涓鑸槸鍦ㄤ紶杈撳崗璁箣涓婁綔涓哄簲鐢ㄧ▼搴忕殑涓閮ㄥ垎鍔犱互瀹炵幇鐨勶紝濡傚浘2鎵紺猴細
2.2 RTCP鎺у埗鍗忚
RTCP 鎺у埗鍗忚闇瑕佷笌RTP鏁版嵁鍗忚涓璧烽厤鍚堜嬌鐢紝褰撳簲鐢ㄧ▼搴忓惎鍔ㄤ竴涓?span>RTP浼氳瘽鏃跺皢鍚屾椂鍗犵敤涓や釜绔彛錛屽垎鍒緵RTP 鍜?span>RTCP浣跨敤銆?span>RTP鏈韓騫朵笉鑳戒負鎸夊簭浼犺緭鏁版嵁鍖呮彁渚涘彲闈犵殑淇濊瘉錛屼篃涓嶆彁渚涙祦閲忔帶鍒跺拰鎷ュ鎺у埗錛岃繖浜涢兘鐢?span>RTCP鏉ヨ礋璐e畬鎴愩傞氬父RTCP浼氶噰鐢ㄤ笌 RTP鐩稿悓鐨勫垎鍙戞満鍒訛紝鍚戜細璇濅腑鐨勬墍鏈夋垚鍛樺懆鏈熸у湴鍙戦佹帶鍒朵俊鎭紝搴旂敤紼嬪簭閫氳繃鎺ユ敹榪欎簺鏁版嵁錛屼粠涓幏鍙栦細璇濆弬涓庤呯殑鐩稿叧璧勬枡錛屼互鍙婄綉緇滅姸鍐點佸垎緇勪涪澶辨鐜囩瓑鍙嶉淇℃伅錛屼粠鑰岃兘澶熷鏈嶅姟璐ㄩ噺榪涜鎺у埗鎴栬呭緗戠粶鐘跺喌榪涜璇婃柇銆?/span>
RTCP鍗忚鐨勫姛鑳芥槸閫氳繃涓嶅悓鐨?span>RTCP鏁版嵁鎶ユ潵瀹炵幇鐨勶紝涓昏鏈夊涓嬪嚑縐嶇被鍨嬶細
RTCP鏁版嵁鎶ユ惡甯︽湁鏈嶅姟璐ㄩ噺鐩戞帶鐨勫繀瑕佷俊鎭紝鑳藉瀵規湇鍔¤川閲忚繘琛屽姩鎬佺殑璋冩暣錛屽茍鑳藉瀵圭綉緇滄嫢濉炶繘琛屾湁鏁堢殑鎺у埗銆傜敱浜?span>RTCP鏁版嵁鎶ラ噰鐢ㄧ殑鏄鎾柟寮忥紝鍥犳浼氳瘽涓殑鎵鏈夋垚鍛橀兘鍙互閫氳繃RTCP鏁版嵁鎶ヨ繑鍥炵殑鎺у埗淇℃伅錛屾潵浜嗚В鍏朵粬鍙備笌鑰呯殑褰撳墠鎯呭喌銆?/span>
鍦ㄤ竴涓吀鍨嬬殑搴旂敤鍦哄悎涓嬶紝鍙戦佸獟浣撴祦鐨勫簲鐢ㄧ▼搴忓皢鍛ㄦ湡鎬у湴浜х敓鍙戦佺鎶ュ憡SR錛岃RTCP鏁版嵁鎶ュ惈鏈変笉鍚屽獟浣撴祦闂寸殑鍚屾淇℃伅錛屼互鍙婂凡緇忓彂閫佺殑鏁版嵁鎶ュ拰瀛楄妭鐨勮鏁幫紝鎺ユ敹绔牴鎹繖浜涗俊鎭彲浠ヤ及璁″嚭瀹為檯鐨勬暟鎹紶杈撻熺巼銆傚彟涓鏂歸潰錛屾帴鏀剁浼氬悜鎵鏈夊凡鐭ョ殑鍙戦佺鍙戦佹帴鏀剁鎶ュ憡RR錛岃RTCP鏁版嵁鎶ュ惈鏈夊凡鎺ユ敹鏁版嵁鎶ョ殑鏈澶у簭鍒楀彿銆佷涪澶辯殑鏁版嵁鎶ユ暟鐩佸歡鏃舵姈鍔ㄥ拰鏃墮棿鎴崇瓑閲嶈淇℃伅錛屽彂閫佺搴旂敤鏍規嵁榪欎簺淇℃伅鍙互浼拌鍑哄線榪旀椂寤訛紝騫朵笖鍙互鏍規嵁鏁版嵁鎶ヤ涪澶辨鐜囧拰鏃跺歡鎶栧姩鎯呭喌鍔ㄦ佽皟鏁村彂閫侀熺巼錛屼互鏀瑰杽緗戠粶鎷ュ鐘跺喌錛屾垨鑰呮牴鎹綉緇滅姸鍐靛鉤婊戝湴璋冩暣搴旂敤紼嬪簭鐨勬湇鍔¤川閲忋?/span>
2.3 RTSP瀹炴椂嫻佸崗璁?/span>
浣滀負涓涓簲鐢ㄥ眰鍗忚錛?span>RTSP鎻愪緵浜嗕竴涓彲渚涙墿灞曠殑妗嗘灦錛屽畠鐨勬剰涔夊湪浜庝嬌寰楀疄鏃舵祦濯掍綋鏁版嵁鐨勫彈鎺у拰鐐規挱鍙樺緱鍙兘銆傛葷殑璇存潵錛?span>RTSP鏄竴涓祦濯掍綋琛ㄧず鍗忚錛屼富瑕佺敤鏉ユ帶鍒跺叿鏈夊疄鏃剁壒鎬х殑鏁版嵁鍙戦侊紝浣嗗畠鏈韓騫朵笉浼犺緭鏁版嵁錛岃屾槸蹇呴』渚濊禆浜庝笅灞備紶杈撳崗璁墍鎻愪緵鐨勬煇浜涙湇鍔°?span>RTSP 鍙互瀵規祦濯掍綋鎻愪緵璇稿鎾斁銆佹殏鍋溿佸揩榪涚瓑鎿嶄綔錛屽畠璐熻矗瀹氫箟鍏蜂綋鐨勬帶鍒舵秷鎭佹搷浣滄柟娉曘佺姸鎬佺爜絳夛紝姝ゅ榪樻弿榪頒簡涓?span>RTP闂寸殑浜や簰鎿嶄綔銆?/span>
RTSP 鍦ㄥ埗瀹氭椂杈冨鍦板弬鑰冧簡HTTP/1.1鍗忚錛岀敋鑷寵澶氭弿榪頒笌HTTP/1.1瀹屽叏鐩稿悓銆?span>RTSP涔嬫墍浠ョ壒鎰忎嬌鐢ㄤ笌HTTP/1.1綾諱技鐨勮娉曞拰鎿嶄綔錛屽湪寰堝ぇ紼嬪害涓婃槸涓轟簡鍏煎鐜版湁鐨?span>Web鍩虹緇撴瀯錛屾鍥犲姝わ紝HTTP/1.1鐨勬墿灞曟満鍒跺ぇ閮藉彲浠ョ洿鎺ュ紩鍏ュ埌RTSP 涓?/span>
鐢?span>RTSP 鎺у埗鐨勫獟浣撴祦闆嗗悎鍙互鐢ㄨ〃紺烘弿榪幫紙Presentation Description錛夋潵瀹氫箟錛屾墍璋撹〃紺烘槸鎸囨祦濯掍綋鏈嶅姟鍣ㄦ彁渚涚粰瀹㈡埛鏈虹殑涓涓垨鑰呭涓獟浣撴祦鐨勯泦鍚堬紝鑰岃〃紺烘弿榪板垯鍖呭惈浜嗕竴涓〃紺轟腑鍚勪釜濯掍綋嫻佺殑鐩稿叧淇℃伅錛屽鏁版嵁緙栫爜/瑙g爜綆楁硶銆佺綉緇滃湴鍧銆佸獟浣撴祦鐨勫唴瀹圭瓑銆?/span>
铏界劧RTSP鏈嶅姟鍣ㄥ悓鏍蜂篃浣跨敤鏍囪瘑絎︽潵鍖哄埆姣忎竴嫻佽繛鎺ヤ細璇濓紙Session錛夛紝浣?span>RTSP榪炴帴騫舵病鏈夎緇戝畾鍒頒紶杈撳眰榪炴帴錛堝TCP絳夛級錛屼篃灝辨槸璇村湪鏁翠釜 RTSP榪炴帴鏈熼棿錛?span>RTSP鐢ㄦ埛鍙墦寮鎴栬呭叧闂涓RTSP鏈嶅姟鍣ㄧ殑鍙潬浼犺緭榪炴帴浠ュ彂鍑?span>RTSP 璇鋒眰銆傛澶栵紝RTSP榪炴帴涔熷彲浠ュ熀浜庨潰鍚戞棤榪炴帴鐨勪紶杈撳崗璁紙濡?span>UDP絳夛級銆?/span>
RTSP鍗忚鐩墠鏀寔浠ヤ笅鎿嶄綔錛?nbsp;
涓夈佹祦濯掍綋緙栫▼
RTP 鏄洰鍓嶈В鍐蟲祦濯掍綋瀹炴椂浼犺緭闂鐨勬渶濂藉姙娉曪紝濡傛灉闇瑕佸湪Linux騫沖彴涓婅繘琛屽疄鏃舵祦濯掍綋緙栫▼錛屽彲浠ヨ冭檻浣跨敤涓浜涘紑鏀炬簮浠g爜鐨?span>RTP搴擄紝濡?span>LIBRTP銆?span> JRTPLIB絳夈?span>JRTPLIB鏄竴涓潰鍚戝璞$殑RTP搴擄紝瀹冨畬鍏ㄩ伒寰?span>RFC 1889璁捐錛屽湪寰堝鍦哄悎涓嬫槸涓涓潪甯鎬笉閿欑殑閫夋嫨錛屼笅闈㈠氨浠?span>JRTPLIB涓轟緥錛岃榪板浣曞湪Linux騫沖彴涓婅繍鐢?span>RTP鍗忚榪涜瀹炴椂嫻佸獟浣撶紪紼嬨?/span>
3.1 鐜鎼緩
JRTPLIB 鏄竴涓敤C++璇█瀹炵幇鐨?span>RTP搴擄紝鐩墠宸茬粡鍙互榪愯鍦?span>Windows銆?span>Linux銆?span>FreeBSD銆?span> Solaris銆?span>Unix鍜?span>VxWorks絳夊縐嶆搷浣滅郴緇熶笂銆傝涓?span>Linux 緋葷粺瀹夎JRTPLIB錛岄鍏堜粠JRTPLIB鐨勭綉绔欙紙http: //lumumba.luc.ac.be/jori/jrtplib/jrtplib.html錛変笅杞芥渶鏂扮殑婧愮爜鍖咃紝姝ゅ浣跨敤鐨勬槸jrtplib- 2.7b.tar.bz2銆傚亣璁句笅杞藉悗鐨勬簮鐮佸寘淇濆瓨鍦?span>/usr/local/src鐩綍涓嬶紝鎵ц涓嬮潰鐨勫懡浠ゅ彲浠ュ鍏惰繘琛岃В鍘嬬緝錛?/span>
|
|