使用CURL从IP Camera Panasonic获取MJPEG Stream时出现问题。
这是我的代码。
int _tmain(int argc, _TCHAR* argv[])
{
CURL *curl;
CURLcode res;
/* Minimalistic http request */
char request[1000];
strcpy(request, "GET /nphMotionJpeg?Resolution=640x480&Quality=Standard HTTP/1.1\r\n\r\n") ;
curl_socket_t sockfd; /* socket */
long sockextr;
size_t iolen;
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.253");
curl_easy_setopt(curl, CURLOPT_USERPWD, "my_usr:my_pass");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
res = curl_easy_perform(curl);
if(CURLE_OK != res)
{
printf("Error: %s\n", strerror(res));
return 1;
}
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr);
if(CURLE_OK != res)
{
printf("Error: %s\n", curl_easy_strerror(res));
return 1;
}
sockfd = sockextr;
/* wait for the socket to become ready for sending */
if(wait_on_socket(sockfd, false, 6000L) < 0)
{
printf("Error: timeout.\n");
return 1;
}
iolen = 0;
res = curl_easy_send(curl, request, strlen(request), &iolen);
if(CURLE_OK != res)
{
printf("Error: %s\n", curl_easy_strerror(res));
return 1;
}
//puts("Reading response.");
/* read the response */
for(;;)
{
char* buf = new char[1024*100];
iolen = 0;
wait_on_socket(sockfd, true, 60000L);
res = curl_easy_recv(curl, buf, 1024*100, &iolen);
if(CURLE_OK != res)
break;
fstream f;
f.open("out.txt", ios::out|ios::binary|ios::app);
if(!f.fail())
{
f.write(buf,iolen);
f.close();
}
delete []buf;
}
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
结果是在第一个循环之后的buf中的内容作为Panasonic文档的描述。
但它在数据响应中只有3帧jpeg。总大小只有3056个字节。这意味着约1KB / Jpeg图像。这是错误的。
在第二个循环中,curl_easy_recv()始终返回CURLE_UNSUPPORTED_PROTOCOL。
我还更改了与Panasonic文档描述相同的请求字符串: “GET http://xxx.xxx.xxx.xxx:yy/nphMotionJpeg?Resolution=640x480&Quality=Standard HTTP / 1.0 \ r \ n” 要么 “GET http://usr:pass@xxx.xxx.xxx.xxx:yy/nphMotionJpeg?Resolution=640x480&Quality=Standard HTTP / 1.0 \ r \ n” - &GT;它会回应“BAD REQUEST”。
我的相机型号是Panasonic BL-C111CE。
答案 0 :(得分:0)
这是一个更好的示例源代码,您可以从以下开始:
http://curl.haxx.se/libcurl/c/url2file.html
你真的应该避免使用CURLOPT_CONNECT_ONLY,curl_easy_recv()和curl_easy_send(),除非你完全了解你正在做什么以及为什么“普通”API不够好。通常情况下,他们是你的问题的错误答案。 libcurl已经完全无法完成HTTP了!
Nitpick:有一次你在libcurl的返回代码上调用strerror(),这将不会显示正确的错误字符串......
答案 1 :(得分:0)
我发现了问题。 命令“GET / nphMotionJpeg?Resolution = 640x480&amp; Quality = Standard HTTP / 1.1 \ r \ n \ r \ n”的原因是不允许访问视频。 我通过更改相机中允许访客用户访问视频的设置来解决此问题。
全部谢谢!