Использование возможностей Live555 HTTP в качестве сервера для сигнализации

В последнее время мне удалось сделать (используя другие библиотеки) потоковый сервер rtsp с Live555, WebRTC и FFMPEG. Все идет отлично, но моя конечная цель - максимально использовать Live555, чтобы уменьшить нагрузку на процессинг. Как только поток rtp запущен, я использую сервер сигнализации HTTP только для keepalive.

У меня вопрос (так как я не вижу ответа ни в коде live555, ни в документации):

Есть ли способ построить HTTP-сервер, используя только Live555?

1 ответ

Решение

В live555 есть встроенный HTTP-сервер, который используется для потоковой передачи RTP через HTTP.

Вы можете использовать его, перегружая handleHTTPCmd_StreamingGET RTSPServer:: RTSPClientConnection

Для реализации вашей реализации GET вам необходимо:

  • перегрузить класс RTSPServer:: RTSPClientConnection для реализации handleHTTPCmd_StreamingGET
  • перегрузить класс RTSPServer, чтобы создать экземпляр перегруженного класса RTSPServer:: RTSPClientConnection

Объединение всего может дать очень упрощенный пример без обработки ошибок, например:

#include "BasicUsageEnvironment.hh"
#include "RTSPServer.hh"

class HTTPServer : public RTSPServer {
    class HTTPClientConnection : public RTSPServer::RTSPClientConnection {
        public:
            HTTPClientConnection(RTSPServer& ourServer, int clientSocket, struct sockaddr_in clientAddr)
              : RTSPServer::RTSPClientConnection(ourServer, clientSocket, clientAddr) {}

        private:
            virtual void handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* fullRequestStr) {        
                // build HTTP answer
                snprintf((char*)fResponseBuffer, sizeof fResponseBuffer,
                   "HTTP/1.1 200 OK\r\n"
                   "Content-Length: %zd\r\n"
                   "\r\n"
                   "%s",
                   strlen(fullRequestStr),fullRequestStr);
            }
    };

    public:
        static HTTPServer* createNew(UsageEnvironment& env, Port rtspPort) {
            return new HTTPServer(env, setUpOurSocket(env, rtspPort), rtspPort);
        }

        HTTPServer(UsageEnvironment& env, int ourSocket, Port rtspPort)
            : RTSPServer(env, ourSocket, rtspPort, NULL, 0) {}

        RTSPServer::RTSPClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_in clientAddr) {
            return new HTTPClientConnection(*this, clientSocket, clientAddr);
        }
};

Этот ответ реализации HTTPServer с полученным запросом http, что-то вроде:

GET / HTTP/1.1
Host: 127.0.0.1:9999
User-Agent: curl/7.54.0
Accept: */*
Другие вопросы по тегам