Как получить MJPEG Stream от IP-камеры Panasonic? - PullRequest
0 голосов
/ 09 февраля 2012

У меня проблема при использовании CURL для получения MJPEG Stream с IP-камеры Panasonic.

Вот мой код.

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;
}

В результате содержимое в буфере после первого цикла выглядит какописание документа Panasonic.

Но он имеет только 3 кадра JPEG в ответе данных.и общий размер только 3056 байт.Это означает, что изображение составляет около 1 КБ / 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» -> ответ «ПЛОХОЙ ЗАПРОС».

Модель моей камеры - Panasonic BL-C111CE.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Я обнаружил проблему.Причина с командой "GET / nphMotionJpeg? Resolution = 640x480 & Quality = Standard HTTP / 1.1 \ r \ n \ r \ n" не разрешена для доступа к видео.Я решаю эту проблему, изменив настройку в моей камере, которая позволяет гостевому пользователю получать доступ к видео.

Спасибо всем!

0 голосов
/ 10 февраля 2012

Вот гораздо лучший пример исходного кода, с которого вы могли бы начать:

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

Вы действительно ДОЛЖНЫ избегать CURLOPT_CONNECT_ONLY, curl_easy_recv () и curl_easy_send (), если только вы не прекрасно знаете, что выи почему «нормальный» API недостаточно хорош.Чаще всего они являются неправильным ответом на ваши проблемы.libcurl уже сам по себе прекрасно выполняет HTTP!

Nitpick: в какой-то момент вы вызываете strerror () для кода возврата из libcurl, который не будет отображать правильную строку ошибки ...

...