2017-07-25 7 views
0

Dernièrement, j'ai réussi à créer (en utilisant d'autres bibliothèques) un serveur de streaming rtsp avec Live555, WebRTC et FFMPEG. Tout va bien, mais mon but ultime est de maximiser mon utilisation de Live555 pour réduire mon empreinte de traitement. Une fois le flux rtp démarré, j'utilise le serveur de signalisation HTTP uniquement pour les keepalives.Utilisation des capacités HTTP Live555 en tant que serveur de signalisation

Ma question est (Comme je ne semble pas trouver la réponse dans le code LIVE555 ni documentation):

Est-il possible de construire un serveur HTTP en utilisant uniquement LIVE555?

Répondre

1

Dans live555, il existe un serveur HTTP intégré qui est utilisé pour la diffusion RTP sur HTTP.

Vous pouvez utiliser une surcharge du handleHTTPCmd_StreamingGET de RTSPServer::RTSPClientConnection

Afin de mettre en œuvre votre implémentation GET, vous devez:

  • surcharge RTSPServer :: classe RTSPClientConnection pour mettre en œuvre handleHTTPCmd_StreamingGET
  • surcharge classe RTSPServer pour instancier votre classe surchargée de RTSPServer :: RTSPClientConnection

Mettre tout ensemble pourrait donner une très simplifier l'échantillon, sans traitement des erreurs, comme:

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

Cette réponse HTTPServer de mise en œuvre à la demande http reçu, quelque chose comme:

GET/HTTP/1.1 
Host: 127.0.0.1:9999 
User-Agent: curl/7.54.0 
Accept: */*