C++ 如何从松下IP摄像机获取MJPEG流?

C++ 如何从松下IP摄像机获取MJPEG流?,c++,curl,libcurl,C++,Curl,Libcurl,我有一个问题,当使用卷曲获得MJPEG流从IP相机松下 这是我的密码 int _tmain(int argc, _TCHAR* argv[]) { CURL *curl; CURLcode res; /* Minimalistic http request */ char request[1000]; strcpy(request, "GET /nphMotionJpeg?Resolution=640x480&Quality=Standard HT

我有一个问题,当使用卷曲获得MJPEG流从IP相机松下

这是我的密码

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;
}
int-tmain(int-argc,_-TCHAR*argv[]
{
卷曲*卷曲;
卷曲编码;
/*最小http请求*/
字符请求[1000];
strcpy(请求,“GET/nphMotionJpeg?分辨率=640x480,质量=标准HTTP/1.1\r\n\r\n”);
卷曲插座插座FD;/*插座*/
长袜子;
尺寸;
curl=curl_easy_init();
if(curl)
{
curl\u easy\u setopt(curl,CURLOPT\u URL,“http://192.168.1.253");
curl_easy_setopt(curl,CURLOPT_USERPWD,“my_usr:my_pass”);
/*不进行传输-仅连接到主机*/
curl_easy_setopt(仅curl、CURLOPT_CONNECT_,1L);
res=旋度(curl)\u容易执行(curl);
如果(卷曲OK!=分辨率)
{
printf(“错误:%s\n”,strerror(res));
返回1;
}
res=curl\u easy\u getinfo(curl、CURLINFO\u LASTSOCKET和sockextr);
如果(卷曲OK!=分辨率)
{
printf(“错误:%s\n”,curl\u easy\u strerror(res));
返回1;
}
sockfd=sockextr;
/*等待套接字准备好发送*/
如果(在插座上等待(sockfd,false,6000L)<0)
{
printf(“错误:超时。\n”);
返回1;
}
iolen=0;
res=curl\u easy\u send(curl、request、strlen(request)和iolen);
如果(卷曲OK!=分辨率)
{
printf(“错误:%s\n”,curl\u easy\u strerror(res));
返回1;
}
//puts(“阅读反应”);
/*阅读回复*/
对于(;;)
{
char*buf=新字符[1024*100];
iolen=0;
在插座上等待(sockfd,true,60000L);
res=旋度(curl,buf,1024*100和iolen);;
如果(卷曲OK!=分辨率)
打破
fsf;
f、 打开(“out.txt”,ios::out | ios::binary | ios::app);
如果(!f.fail())
{
f、 写(buf,iolen);
f、 close();
}
删除[]buf;
}
/*总是清理*/
旋度\轻松\清洁(旋度);
}
返回0;
}
结果是在第一个循环之后以buf表示的内容作为松下文档的描述

但它只有3帧jpeg的数据响应。总大小仅为3056字节。这意味着大约1KB/Jpeg图像。这是错误的

在第二个循环中,curl\u easy\u recv()总是返回CURLE\u UNSUPPORTED\u协议

我还更改了与Panasonic文档描述相同的请求字符串: “获取HTTP/1.0\r\n” 或 “获取HTTP/1.0\r\n” -->它将响应“错误请求”


我的相机型号是松下BL-C111CE。

这里有一个更好的示例源代码,您可以从以下代码开始:

除非您非常清楚自己在做什么以及“普通”API不够好的原因,否则您确实应该避免使用CURLOPT_CONNECT_ONLY、curl_easy_recv()和curl_easy_send()。他们往往是你问题的错误答案。libcurl本身已经做得非常好了


吹毛求疵:有一次你在libcurl的返回代码上调用strerror(),它不会显示正确的错误字符串…

我发现了问题所在。 命令“GET/nphMotionJpeg?分辨率=640x480&Quality=标准HTTP/1.1\r\n\r\n”的原因不允许访问视频。 我通过改变相机中允许来宾用户访问视频的设置来解决这个问题


谢谢大家

谢谢,我已经阅读了你们链接中的示例。但我不知道如何发送GET命令来检索运动Jpeg流。你能帮助我吗?谢谢。更多信息:如果我用SnapshotJPEG=>替换nphMotionJpeg命令,我可以很好地处理上面的代码。GET是要求libcurl获取HTTP URL时的默认请求