【问题标题】:How to get MJPEG Stream from IP Camera Panasonic?如何从 IP Camera Panasonic 获取 MJPEG 流?
【发布时间】:2012-02-09 15:29:51
【问题描述】:

我在使用 CURL 从 IP Camera Panasonic 获取 MJPEG 流时遇到问题。

这是我的代码。

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中的内容作为松下文档的描述。

但它在数据响应中只有 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" --> 它将响应“BAD REQUEST”。

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

【问题讨论】:

    标签: c++ curl libcurl


    【解决方案1】:

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

    http://curl.haxx.se/libcurl/c/url2file.html

    你真的应该避免使用 CURLOPT_CONNECT_ONLY、curl_easy_recv() 和 curl_easy_send(),除非你非常清楚自己在做什么以及为什么“普通”API 不够好。通常情况下,它们是您问题的错误答案。 libcurl 本身已经可以很好地完成 HTTP 了!

    Nitpick:有一次你在 libcurl 的返回码上调用 strerror(),它不会显示正确的错误字符串...

    【讨论】:

    • 谢谢,我已经阅读了您链接中的示例。但我不知道如何发送 GET 命令来检索 Motion Jpeg 流。你能帮助我吗?谢谢。
    • 更多信息:如果我用 SnapshotJPEG 替换 nphMotionJpeg 命令 => 上面的代码可以正常工作。
    • GET 是您要求 libcurl 获取 HTTP URL 时的默认请求
    【解决方案2】:

    我发现了问题所在。 命令“GET /nphMotionJpeg?Resolution=640x480&Quality=Standard HTTP/1.1\r\n\r\n”的原因是不允许访问视频。 我通过更改相机中允许访客用户访问视频的设置来解决此问题。

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2012-04-26
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      相关资源
      最近更新 更多