2 修改vid_stream.c,在put_frame和get_frame里,换上我们自己的视频源。这种方法使用的最多,很多人在1.x版本里支持视频,就用这种方法。
3 重新构造sdp,自己创建rtp通道。
在sdp上,pjsua_call_make_call这个函数非常方便,直接呼叫对方。不过它在底层做了太多工作,比如启动了声卡。而不用这个函数,直接用比较底层的pjsip_inv_send_msg,自己处理的工作相对比较多(但不难,不过这样就不需要pjsua这个现成的程序了,所以我们继续用pjsua_call_make_call)。
不过还好,pj库提供了大量的回调,其中一个:on_call_sdp_created,就是在创建sdp后回调上来,由我们自己再修改。比如我们自己定义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等。
这是发起呼叫时的,接收方收到后的回应之后,也会触发这个回调,自己设定RTP端口,payload type就可以了。
2
呼叫成功后,双方建立起连接关系,这时需要传rtp数据了。pjsua把这些工作都放在底层了,不做任何修改,只需要在发送和接收时,自己做一些处理就行。
先说接收方(参考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
}
这段代码是本地启动rtp一个端口用来接收视频数据。
然后,从sdp得到对方发送的ip和端口,调用pjmedia_transport_attach,建立关联就可以了。
实现了rtp ,rtsp部分,还有rtcp没搞定网上找了下,没发现很好的解释,如图字段,哪位帮忙讲解下:主要是这个:以上是我通过抓包软件根据vlc获取的rtcp部分我想发送rtcp到ipc,发现rtcp包有两个部分rr sd而rr时刻是变化的,sd部分一个特定的IPC是固定的网上貌 是没有关于这个部分的解释,rr变化的规律欢迎分享,转载请注明来源:内存溢出
评论列表(0条)