osip_message_t* invite = NULL;
char from[256],to[256],subject[256];
snprintf(from,256,"sip:%s@%s:%d","34020000002000000001","192.168.1.136",m_sipPort);
snprintf(to,256,"sip:%s@%s:%d","34020000001320000001","192.168.1.87",m_sipPort);
snprintf(subject,256,"%s:0,%s:0","34020000001320000001","34020000002000000001");
int ret = eXosip_call_build_initial_invite(m_exCtx, &invite,to,from,NULL,subject);
if(ret != 0)
{
fprintf(stderr,"eXosip_call_build_initial_invite Failed!");
return;
}
char body[4096];
int bodyLen = snprintf(body, 4096,
"v=0\r\n"
"o=34020000001310000001 0 0 IN IP4 192.168.1.136\r\n"
"s=Play\r\n"
"c=IN IP4 192.168.1.136\r\n"
"t=0 0\r\n"
"m=video 5060 RTP/AVP 96 97 98\r\n"
"a=rtpmap:96 PS/90000\r\n"
"a=rtpmap:97 MPEG4/90000\r\n"
"a=rtpmap:98 H264/90000\r\n"
"a=recvonly\r\n");
osip_message_set_body(invite, body, bodyLen);
osip_message_set_content_type(invite, "application/sdp");
eXosip_lock(m_exCtx);
ret = eXosip_call_send_initial_invite(m_exCtx, invite);
if(0 != ret)
{
qDebug() << "send error: " << strerror(ret) << "\n";
fprintf(stderr,"send invitial invite failed!\n");
qDebug() << ret << "\n";
}
eXosip_unlock(m_exCtx);
通过以上代码向大华摄像头请求实时视频流,返回404. 找不到问题在哪 ,希望解答一下
此代码似乎是用 C 编写的,并且使用 eXosip 库来构建和发送 SIP 邀请请求。邀请请求在其正文中包含一条 SDP 消息,该消息描述了媒体格式和传输信息。
该代码首先初始化指向名为“invite”的osip_message_t对象的指针,并为 INVITE 请求的“from”、“to”和“subject”字段初始化三个 char 数组。“发件人”和“收件人”字段的格式为 SIP URI,其中包含主叫方和被叫方的用户 ID 和 IP 地址。“主题”字段包含有关会话的信息,包括相关双方的 ID。
然后,代码调用 eXosip 库函数“eXosip_call_build_initial_invite”来构建邀请请求,传入 eXosip 上下文和“to”、“from”和“subject”字段。如果此函数返回非零值,则会打印一条错误消息并返回该函数。
然后,代码在“body”字符数组中构造 SDP 消息,并使用“osip_message_set_body”函数将其设置为 INVITE 消息的正文。消息的内容类型使用“osip_message_set_content_type”功能设置为“应用程序/sdp”。
最后,代码调用 eXosip 库函数“eXosip_call_send_initial_invite”来发送邀请请求。如果此函数返回非零值,则打印错误消息。
请务必注意,此代码片段不包括所有潜在故障场景的错误处理,因此可能需要额外的错误检查和处理才能实现可靠的实现。
exosip请求失败404原因的可能是视频流地址、端口、通道或其它参数等没有设置正确,导致无法获取视频流。
cd libexosip2-5.1.0
./configure --prefix=/home/sip/
make
make install
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你提供的代码,我看不出直接导致404错误的问题。404错误通常表示客户端请求了不存在的资源,所以你需要检查以下几点:
确认摄像头的IP地址、端口号、SIP信息是否正确。请先通过其他工具(如sipp)测试摄像头的SIP服务是否正常。
确认OSIP/eXosip库初始化是否正确。你需要在程序启动时初始化库,并使用eXosip_listen_address()绑定SIP地址和端口号。
确认从摄像头返回的SIP错误消息。你可以通过eXosip_event_get_response()方法获取服务器返回的SIP消息,并检查是否包含响应错误码404。
代码示例:
eXosip_event_t *evt = NULL;
int cnt = 0;
while(1) {
evt = eXosip_event_wait(0, 500); // 等待500ms,获取eXOSIP事件
if(evt == NULL) {
cnt ++;
if(cnt > 120) { // 60秒内没有事件则退出
break;
}
continue;
}
if(evt->type == EXOSIP_CALL_INVITE_ANSWERED) {
if(evt->response->status_code == 200) {
// 成功响应,获取SDP信息、打开视频等操作
// ...
break;
} else if(evt->response->status_code == 404) {
// 404错误,资源未找到
fprintf(stderr, "Error: 404 not found\n");
break;
} else {
// 其他错误
fprintf(stderr, "Error: %d\n", evt->response->status_code);
break;
}
}
// 其他eXOSIP事件处理
// ...
}
希望以上信息对你有所帮助。如果你对具体问题有更多的信息或代码,可以提供给我,我会尽力帮你解决。
如果我的回答解决了您的问题,请采纳!