簡體   English   中英

如何從松下IP攝像機獲取MJPEG流?

[英]How to get MJPEG Stream from IP Camera Panasonic?

使用CURL從Panasonic IP攝像機獲取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中的內容,作為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“->它將響應“ BAD REQUEST”。

我的相機型號是Panasonic BL-C111CE。

這是一個更好的示例源代碼,您可以從以下代碼開始:

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

除非您完全清楚自己在做什么以及為什么“常規” API不夠好,否則您應該避免使用CURLOPT_CONNECT_ONLY,curl_easy_recv()和curl_easy_send()。 通常,它們是對您問題的錯誤答案。 libcurl本身已經可以完美實現HTTP了!

Nitpick:有一次,您在libcurl的返回碼上調用strerror(),但不會顯示正確的錯誤字符串...

我發現了問題。 命令“ GET / nphMotionJpeg?Resolution = 640x480&Quality = Standard HTTP / 1.1 \\ r \\ n \\ r \\ n”的原因不允許訪問視頻。 我通過更改相機中允許訪客用戶訪問視頻的設置來解決此問題。

謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM