日韩欧美国产一区二区三区_五月天欧美精品_国产精品一区不卡_欧美精品乱码久久久久久

內(nèi)容字號(hào):默認(rèn)大號(hào)超大號(hào)

段落設(shè)置:段首縮進(jìn)取消段首縮進(jìn)

字體設(shè)置:切換到微軟雅黑切換到宋體






使用pjsip傳輸已經(jīng)編碼的視頻

時(shí)間:2016-06-12 來(lái)源:中國(guó)集群通信網(wǎng) 作者:本站整理 點(diǎn)擊:

jsip功能很強(qiáng),做sip rtp語(yǔ)音通話庫(kù)首選。在2.0之后,也支持視頻。不過(guò),它的視頻功能缺省是從視頻設(shè)備采集,然后進(jìn)行編譯,再發(fā)送出去的。假設(shè),我們已經(jīng)有了視頻源,比如IP攝像機(jī),不需要采集和編碼這個(gè)過(guò)程,怎么處理呢?假設(shè)我們采用pjsip附帶的pjsua為例。

通常的方法:

1 把視頻源當(dāng)然文件來(lái)處理,sample有。不過(guò)這種方法用的不多。

2 修改vid_stream.c,在put_frame和get_frame里,換上我們自己的視頻源。這種方法使用的最多,很多人在1.x版本里支持視頻,就用這種方法。

3 本文采用的:重新構(gòu)造sdp,自己創(chuàng)建rtp通道。

前兩個(gè)方法思路直接,代碼量都不小,尤其是第二種,需要修改pj底層代碼。

如果基于pjsua做一個(gè)簡(jiǎn)單的視頻通信,可以采用本文中的方法。其實(shí)代碼量也不小,不過(guò)sample提供了參考,實(shí)現(xiàn)起來(lái)也比較容易。下面簡(jiǎn)單說(shuō)明:

1 關(guān)鍵點(diǎn)在sdp上,pjsua_call_make_call這個(gè)函數(shù)非常方便,直接呼叫對(duì)方。不過(guò)它在底層做了太多工作,比如啟動(dòng)了聲卡。而不用這個(gè)函數(shù),直接用比較底層的pjsip_inv_send_msg,自己處理的工作相對(duì)比較多(但不難,不過(guò)這樣就不需要pjsua這個(gè)現(xiàn)成的程序了,所以我們繼續(xù)用pjsua_call_make_call)。

不過(guò)還好,pj庫(kù)提供了大量的回調(diào),其中一個(gè):on_call_sdp_created,就是在創(chuàng)建sdp后回調(diào)上來(lái),由我們自己再修改。比如我們自己定義rtp的端口g_local_port。

void on_call_sdp_created(pjsua_call_id call_id,

pjmedia_sdp_session *sdp,

pj_pool_t *pool,

const pjmedia_sdp_session *rem_sdp)

{

int nPort;

if (sdp != NULL)

{

pjmedia_sdp_media *m = sdp->media[sdp->media_count-1];

m->desc.port = g_local_port;

pjmedia_sdp_conn *c = sdp->conn;

char* addr;

if (c)

addr= c->addr.ptr;

else

{

const pj_str_t *hostname;

pj_sockaddr_in tmp_addr;

char *addr;

hostname = pj_gethostname();

pj_sockaddr_in_init(&tmp_addr, hostname, 0);

addr = pj_inet_ntoa(tmp_addr.sin_addr);

sdp->conn = (pjmedia_sdp_conn *)pj_pool_zalloc (pool, sizeof(pjmedia_sdp_conn));

sdp->conn->net_type = pj_str("IN");

sdp->conn->addr_type = pj_str("IP4");

sdp->conn->addr = pj_str(addr);

}

sdp->origin.addr = *pj_gethostname();

}

}

同樣,這里還可以修改payload type等。

這是發(fā)起呼叫時(shí)的,接收方收到后的回應(yīng)之后,也會(huì)觸發(fā)這個(gè)回調(diào),自己設(shè)定RTP端口,payload type就可以了。

呼叫成功后,雙方建立起連接關(guān)系,這時(shí)需要傳rtp數(shù)據(jù)了。pjsua把這些工作都放在底層了,不做任何修改,只需要在發(fā)送和接收時(shí),自己做一些處理就行。

先說(shuō)接收方(參考siprtp.c源碼):

pj_status_t init_local_rtp()

{

if (m_bInitMedia)

{

destroy_media();

}

//g_local_port = local_port;

pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);

    pool = pj_pool_create(&(cp.factory), "test", 1000, 512, NULL);

int status;

//status = pjmedia_endpt_create(&cp.factory,  pjsip_endpt_get_ioqueue(pjsua_get_pjsip_endpt()), 0, &med_endpt);

status = pjmedia_endpt_create(&cp.factory, NULL, 1, &med_endpt);

status = pjmedia_rtp_session_init(&video.out_sess, 97, pj_rand());

status = pjmedia_rtp_session_init(&video.in_sess, 97, 0);

status = pjmedia_transport_udp_create(med_endpt, NULL, g_local_port,  0, &video.transport);

m_bInitMedia = true;

video.active = true;

return 0;

}

這段代碼是本地啟動(dòng)rtp一個(gè)端口用來(lái)接收視頻數(shù)據(jù)。

然后,從sdp得到對(duì)方發(fā)送的ip和端口,調(diào)用pjmedia_transport_attach,建立關(guān)聯(lián)就可以了。

發(fā)送方同樣調(diào)用上面函數(shù),初始化本地端口,但不需要pjmedia_transport_attach。(假定視頻傳輸是單方向的)

發(fā)送動(dòng)作就比較簡(jiǎn)單了,先把要發(fā)的數(shù)據(jù)分包,大小不超過(guò)1400,然后pjmedia_rtp_encode_rtp,再pjmedia_transport_send_rtp。

上面還沒(méi)有講接收方是怎么接數(shù)據(jù)的,這里也用到了pj提供的回調(diào)機(jī)制:

status = pjmedia_transport_attach(video.transport, &video, 

//&info.rem_addr, 

&remote_addr,

NULL, 

sizeof(pj_sockaddr_in),

&on_rx_rtp,

NULL);

這里面的on_rx_rtp就是接收RTP的回調(diào)。

video.transport等定義:

struct media_stream

{

    /* Static: */

    unsigned  call_index;     /* Call owner.  */

    unsigned  media_index;     /* Media index in call. */

    pjmedia_transport   *transport;     /* To send/recv RTP/RTCP */

    /* Active? */

    pj_bool_t  active;     /* Non-zero if is in call. */

    /* Current stream info: */

    pjmedia_stream_info  si;     /* Current stream info. */

    /* More info: */

    unsigned  clock_rate;     /* clock rate  */

    unsigned  samples_per_frame; /* samples per frame */

    unsigned  bytes_per_frame;   /* frame size.  */

    /* RTP session: */

    pjmedia_rtp_session  out_sess;     /* outgoing RTP session */

    pjmedia_rtp_session  in_sess;     /* incoming RTP session */

    /* RTCP stats: */

    pjmedia_rtcp_session rtcp;     /* incoming RTCP session. */

    /* Thread: */

    pj_bool_t  thread_quit_flag;  /* Stop media thread. */

    pj_thread_t  *thread;     /* Media thread.  */

};

struct media_stream video;


(中國(guó)集群通信網(wǎng) | 責(zé)任編輯:李俊勇)

中國(guó)集群通信網(wǎng),國(guó)內(nèi)首家集群通信專(zhuān)業(yè)網(wǎng)站。

Copyright © PttCn.Net, All Rights Reserved.   

聯(lián)系我們 聯(lián)系我們 中國(guó)集群通信網(wǎng) 對(duì)講機(jī)學(xué)堂 對(duì)講機(jī)世界

主站蜘蛛池模板: 国产精品久久久久久av下载红粉 | 久久国产精品久久久久久久久久| 无码av天堂一区二区三区 | 高清国产一区| 国产一区视频在线播放| 99在线观看视频| 久久久久中文字幕| 91精品视频在线看| 欧美精品卡一卡二| 日韩欧美精品免费| 亚洲熟妇无码一区二区三区| 国产精品色悠悠| 久久精品国产成人| 日本久久久久久久久| 亚洲欧洲精品在线| 99色精品视频| 国产精品久久77777| 日产国产精品精品a∨| 精品午夜一区二区三区| 久久偷窥视频| 日韩亚洲综合在线| 亚洲最新免费视频| 97久久精品视频| 国产99视频在线观看| 国产精品444| 国产九九精品视频| 国产一区二区在线视频播放| 久久97精品久久久久久久不卡| 久久在线精品视频| 欧美xxxx综合视频| 久久久久久久久久久99| 欧洲精品在线视频| 日韩中文字幕在线视频播放| 国产国语刺激对白av不卡| 国产精品毛片va一区二区三区| 国产精品美女免费看| 国产成人精品av在线| 国产传媒久久久| 亚洲最大av在线| 日韩福利视频| 免费看成人午夜电影|