GB28181學習之路——實時視頻點播

主要寫下信令構造吧,我也是到處查資料然後調試才調通的,所以就拿我的代碼來看吧,也不用解釋。

下面是構造invite的方法:

osip_message_t *invite = NULL;
i=osip_message_init(&invite);
bSipInviteBuild(&invite);
#define MAXLINE 4096

#define MESSAGE_MAX_LENGTH 4000
#define MAX_ADDR_STR 128
#define MESSAGE_ENTRY_MAX_LENGTH 256
#define SIP_PORT 5060
#define EXPIRES_TIME_INSECS 3600
#define USER_ID "7929"
#define SIP_PROXY "sip:[email protected]:5060"
#define SIP_FROM "sip:[email protected]:37100"
#define SIP_TO "sip:[email protected]:5060"
#define SIP_CONTACT "sip:[email protected]:37100"
#define LOCAL_IP "192.168.31.13"

int bSipInviteBuild(osip_message_t **regMsgPtrPtr)
{
	int status;
	char *callidNumberStr = NULL;
	char *seqNumStr = NULL;
	osip_call_id_t *callidPtr;
	char temp[MAXLINE];
	char sipPort[MAXLINE];
	osip_cseq_t *cseqPtr;
	unsigned int number;
	osip_message_t     *regMsgPtr;
	char expires[10]; 

	if((status = osip_message_init(&regMsgPtr)) != 0){
		OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"Can't init message!/n"));
		return -1;
	}
	osip_message_set_method(regMsgPtr, osip_strdup("INVITE"));

	osip_uri_init(&(regMsgPtr->req_uri));
	if ( ( status = osip_uri_parse(regMsgPtr->req_uri, SIP_PROXY) ) != 0)
	{
		OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"uri parse failed!/n"));
		osip_message_free(regMsgPtr);
		return -1;
	}
	osip_message_set_version(regMsgPtr, osip_strdup("SIP/2.0"));
	osip_message_set_status_code(regMsgPtr, 0);
	osip_message_set_reason_phrase(regMsgPtr, NULL);

	char strFrom[MAXLINE];
	snprintf(strFrom, MAXLINE, "%s;tag=%d", SIP_FROM, osip_build_random_number());
	osip_message_set_to(regMsgPtr, SIP_TO);
	osip_message_set_from(regMsgPtr, strFrom);
	char strCallId[MAXLINE];
	snprintf(strCallId, MAXLINE, "%d", osip_build_random_number());
	osip_message_set_call_id(regMsgPtr, strCallId);

	if((status = osip_cseq_init(&cseqPtr)) != 0 ){
		OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"seq init failed!/n"));
		osip_message_free(regMsgPtr);
		return -1;
	}
	seqNumStr = (char *)osip_malloc(MAX_ADDR_STR);
	sprintf(seqNumStr,"%i", 20);
	osip_cseq_set_number(cseqPtr, seqNumStr);
	osip_cseq_set_method(cseqPtr, osip_strdup("INVITE"));
	regMsgPtr->cseq = cseqPtr;

    osip_message_set_supported (regMsgPtr, "100rel");
	osip_message_set_max_forwards(regMsgPtr, "70"); 

	sprintf(sipPort, "%i", SIP_PORT);
	sprintf(temp, "SIP/2.0/%s %s:37100;rport;branch=z9hG4bK%u", "TCP",LOCAL_IP,osip_build_random_number() );
	osip_message_set_via(regMsgPtr, temp);

	osip_message_set_contact(regMsgPtr, SIP_CONTACT);
	sprintf(expires, "%i", EXPIRES_TIME_INSECS);
	osip_message_set_content_length(regMsgPtr, "0");
	*regMsgPtrPtr = regMsgPtr;
	return 0;
}

然後是附加SDP:

char req_xml_body[MAXLINE] = {0};
memset(req_xml_body, 0, sizeof(req_xml_body));
snprintf(req_xml_body, 4096,  
"v=0\r\n"
"o=%s 0 0 IN IP4 %s\r\n"
"s=Play\r\n"
"c=IN IP4 %s\r\n"
"t=0 0\r\n"
"m=video %d TCP/RTP/AVP 96 98 97\r\n"
"a=recvonly\r\n"
"a=rtpmap:96 PS/90000\r\n"
"a=rtpmap:98 H264/90000\r\n"
"a=rtpmap:97 MPEG4/90000\r\n"
"a=setup:passive\r\n"
"a=connection:new\r\n"
"y=%s\r\n"
,"32010000001320000121", "192.168.31.13", "192.168.31.13", 554,"1320000121");
osip_message_set_content_type(invite, "APPLICATION/SDP");
osip_message_set_body(invite, req_xml_body, strlen(req_xml_body));	

o c 處的填轉發服務器的地址,可以把虛擬機作爲轉發服務器,轉發服務器搭建參照zlmediakit的wiki介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章