Использование возможностей 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: */*