應網友需求,整理 ortp (oRTP 0.9.1) 程式設計範例。環境:VS2008 + Windows,語言 C++,對 C 風格 ortp API 進行 RAII 風格封裝。完整工程見附件,編譯後開兩個執行個體,一選 Client 一選 Server 即可測試。
RTP_SESSION_RECVONLY 會話、自適應抖動補償、阻塞式接收。RTP_SESSION_SENDONLY 會話、遠端地址設定、時間戳遞增發送。init()/deInit() 管理 Winsock 與 ortp 庫全域初始化/清理;Payload Type 34 (視訊)、時間戳增量 3600 (90kHz 時鐘下 40ms/幀)。COrtpClientclass COrtpClient {
public:
COrtpClient(); ~COrtpClient();
static bool init(); // WSAStartup + ortp_init + ortp_scheduler_init
static bool deInit(); // ortp_exit + WSACleanup
bool create(const char* localip, int localport); // 綁定本地 IP:Port
bool get_recv_data(char* pBuffer, int& len); // 循環 rtp_session_recv_with_ts 直到 have_more=0
private:
RtpSession* m_pSession;
long m_curTimeStamp;
int m_timeStampInc; // 3600
};
COrtpServerclass COrtpServer {
public:
COrtpServer(); ~COrtpServer();
static bool init(); static bool deInit();
bool create(const char* destIP, int destport); // 設定遠端地址
int send_data(unsigned char* buffer, int len); // rtp_session_send_with_ts + 時間戳遞增
private:
RtpSession* m_pSession;
long m_curTimeStamp;
int m_timeStampInc;
char* m_ssrc; // 可選 SSRC
};
rtp_session_set_blocking_mode(1) + rtp_session_set_scheduling_mode(1),簡化同步邏輯。rtp_session_enable_adaptive_jitter_compensation(1) + rtp_session_set_jitter_compensation(40) (ms)。send_data 後 m_curTimeStamp += m_timeStampInc;接收端每次 get_recv_data 成功後同步遞增,確保同步。get_recv_data 內部循環 rtp_session_recv_with_ts,累積至緩衝區或達 have_more=0,單次讀取上限 1024 位元組。void main() {
cout << "1-Client 2-Server: ";
int num; cin >> num;
if (num == 1) {
COrtpClient::init();
COrtpClient client;
client.create("127.0.0.1", 8000);
char buf[10*1024];
while (1) {
int len = sizeof(buf);
if (client.get_recv_data(buf, len))
cout << "recv " << len << " bytes\n";
else Sleep(10);
}
} else if (num == 2) {
COrtpServer::init();
COrtpServer server;
server.create("127.0.0.1", 8000);
unsigned char buf[8*1024];
while (1) {
server.send_data(buf, sizeof(buf));
cout << "send bytes\n";
Sleep(100);
}
}
}
SSRC 指定,否則庫自動產生。ortp.h。本文出自「對影成三人」部落格,轉載請保留出處:原文連結