jrtplib库RTPSession.Create()的错误

lzlsl 2009-04-16 04:04:10
RT```使用jrtplib库的RTPSession.Create()函数时返回这个错误值-858993460,在源文件里查到错误类型是Unknown````郁闷了 ``昨天都还用得好好的```今天怎么就出错了`````
...全文
405 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lzlsl 2009-04-20
我犯了个低级错误```断点位置下错了 ``-858993460是int变量未初始化的默认值````函数的返回值应该是0```说明创建会话成功了````不过发现一个问题 ``我试了很多次```int变量的默认值都是-858993460````不是随机的说```
回复
lzlsl 2009-04-18
没有啊```
回复
UDX协议 2009-04-18
端口是否被你其他程序占用?
回复
lzlsl 2009-04-18
up一下````
回复
辛鹤 2009-04-18
把它的lib文件加进来,
再#includ "rtpsession.h"

就像用普通的lib一样,加入lib和头文件后就可以直接调用里面的函数了。

Get it try.
Good luck.

利用 Video Streaming 來設計視訊會議軟體, 其中在技術層面不可或缺的一部份就是 RTP Protocol 的部份。RTP 也是 VoIP (Voice over IP) 相關技術所使用的通訊協定。

為了配合 Video Streaming 來設計完整的視訊會議軟體, 我們勢必要加入 RTP 的技術。在這方面, 我們選擇使用現成的 RTP 程式庫 – JRTPLIB。

與 video4linux 程式庫不同的是, video4linux 在決策上我們選擇自行發展, 但 JRTPLIB 則是一個很成熟的專案了, 而且仍在持續維護, 未來 JRTPLIB 還會加入 IPV6 與 multicasting 方面的完整支援, 因此使用 JRTPLIB 來發展我們的 Video Streaming 軟體才是解決之道。

與 JRTPLIB 相關的計畫包括 JVOIPLIB 與 JTHREAD, 這兩個程式庫對我們的工作是相關有幫助的, 本文則先將重心放在 JRTPLIB上面。

JRTPLIB 實作了 RTP 協定, 並且提供了簡單易用的 API 供軟體開發使用。JRTPLIB 也支援了 session, 並且可在底下平臺執行:

MS-Windows 95,98 and NT
Linux
FreeBSD
HP-UX
Solaris
VxWorks
JRTPLIB 的官方首頁為:

http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html

JRTPLIB 的第一個程式

底下我們介紹過 JRTPLIB 的設計方法後, 大家就會發覺到 JRTPLIB 實在很好上手。要利用 RTP 通訊協定傳送資料, 第一步要先建立一個 session, 方法如下:

#include "rtpsession.h"

int main(void)
{
RTPSession sess;

sess.Create(5000);
return 0;
}


第一步我們要先把 rtpsession.h 給 include 進來:

#include "rtpsession.h"

接下來再產生 RTPSession 類別的物件:

RTPSession sess;

最後再建立 session 就完成最簡單的初始動作了:

sess.Create(5000);

Create() 成員函數接收一個 portbase 的參數, 指定 session 的 port, 接著開始初始化 timestamp 與 packet sequence number。RTPSession::Create() 程式碼如下:

int RTPSession::Create(int localportbase,unsigned long localip)
{
int status;

if (initialized)
return ERR_RTP_SESSIONALREADYINITIALIZED;
if ((status = rtpconn.Create(localportbase,localip)) < 0)
return status;
if ((status = contribsources.CreateLocalCNAME()) < 0)
{
rtpconn.Destroy();
return status;
}
CreateNewSSRC();
localinf.CreateSessionParameters();
rtcpmodule.Initialize();
initialized = true;
return 0;
}

Create() 接著會再建立一個 SSRC:

CreateNewSSRC();

SSRC 為 local synchronization source identifier。

指定目的端

接下來再指定目的端的 IP 位址:

unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr,5000);

這裡表示我們要將封包傳送到 127.0.0.1 (本地端) 的 port 5000, 只要照著套用即可。

傳送 RTP 封包

sess.SendPacket("1234567890",10,0,false,10);

1234567890 是要傳送的字串, 第二個參數 (10) 表示傳送字串的長度, 第三個參數為 payload type, 第四個參數為 mark flag, 最後第五個參數則是 timestamp 的遞增單位。

RTP 的封包格式


RTP 與其它 Internet 通訊協定一樣, 在封包裡也會有封包檔頭, 接著才是封包的資料。

在 RTPsession::SendPacket() 的第三個參數與第四個參數分別是 payload type 與 mark flag, 在 RTP 封包檔頭裡, 分別是 Payload 欄位與 M 欄位。

Payload 欄位的長度為 7 bits, M 欄位的長度為 1 bits。


RTP 的 Payload type

RTP 檔頭的 Payload type 指定封包資料的編碼方式, 我們列出五個常用的 Audio 標準, 與三個常用的 Video 標準, 其中 JPEG/H.261/H.263 我們本文第一篇裡都有做過簡單的介紹。常用的 Payload type 如下表:

Payload type 編碼標準 支援Audio或Video Clock Rate (Hz)
2 G.721 A 8000
4 G.723 A 8000
7 LPC A 8000
9 G.722 A 8000
15 G.728 A 8000
26 JPEG V 90000
31 H.261 V 90000
34 H.263 V 90000
回复
lzlsl 2009-04-16
试一下DEBUG版本``错误依旧````

但是昨天我一直都是用的RELEASE版本的````没见出错啊````
回复
满衣兄 2009-04-16
jrtplib的debug版本和release版本不能混用。
即debug版本的lib要对应exe的debug版本,release版本的lib要对应exe的release版本。
回复
发帖
多媒体/流媒体开发
创建于2007-08-27

2441

社区成员

专题开发/技术/项目 多媒体/流媒体开发
申请成为版主
帖子事件
创建了帖子
2009-04-16 04:04
社区公告
暂无公告