3

別のプログラムにストリーミングしているLive555でビデオサーバーにアクセスしています。rtsp PAUSEおよびPLAYコマンドをビデオサーバーに送信して、他のプログラムへのストリーミングを停止したいと思います。これは可能ですか?私のコードは何もしていないようです。サーバーに接続でき、サーバーは完全なPAUSEコマンドを受信したことを確認します。

VideoServer.h

//must make this store session so we can access the session in the static
//callbacks 
class MyRTSPClient: public RTSPClient{
protected:
  MyRTSPClient(UsageEnvironment& env, char const* rtspURL,
    int verbosityLevel, char const* applicationName, portNumBits tunnelOverHTTPPortNum):
  RTSPClient(env, rtspURL, verbosityLevel, applicationName, tunnelOverHTTPPortNum)
    {

    }

public:

  MediaSession* session_;

  bool sessionStarted_;

  static MyRTSPClient* createNew(UsageEnvironment& env, char const* rtspURL,
                                     int verbosityLevel = 0,
                                     char const* applicationName = NULL,
                                     portNumBits tunnelOverHTTPPortNum = 0) 
    {
      return new MyRTSPClient(env, rtspURL, verbosityLevel, applicationName,     tunnelOverHTTPPortNum);
      }

};


class VideoServer
{

public:

  VideoServer();


private:
  TaskScheduler* scheduler_;
  UsageEnvironment* env_;
  MyRTSPClient* rtspClient_;
  char eventLoopWatchVariable;

  //Asynchronously start the connection
  void StartConnection();

  static void callbackDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString);

  static void callbackPAUSEPLAY(RTSPClient* rtspClient, int resultCode, char* resultString);
};

VideoServer.cpp

VideoServer::VideoServer()
{
  eventLoopWatchVariable = 0;
  scheduler_ = BasicTaskScheduler::createNew();
  env_ = BasicUsageEnvironment::createNew(*scheduler_);

  //create rtsp client with default params and our url and environment
  rtspClient_ = MyRTSPClient::createNew(*env_, 
      MINI_HARV_AXIS_RTSP_URL, 4, "jtalon5");

  //call description to initialize the session

  if (rtspClient_ == NULL) {
    std::cout << "Failed to create a RTSP client for URL \"" << 
    MINI_HARV_AXIS_RTSP_URL << std::endl;
    return;
  }
  std::cout << "made the client!" << std::endl;
  // Next, send a RTSP "DESCRIBE" command, to get a SDP description for the stream.
  // Note that this command - like all RTSP commands - is sent asynchronously; we do    not block, waiting for a response.
  // Instead, the following function call returns immediately, and we handle the RTSP response later, from within the event loop:
  rtspClient_->sendDescribeCommand(callbackDESCRIBE); 

  //start doEventLoop in separate thread so it is not blocking
  boost::thread thr1(&MiniHarvAxisInterface::StartConnection, this);

}

void VideoServer::StartConnection()
{
  env_->taskScheduler().doEventLoop(&eventLoopWatchVariable);
}

void MiniHarvAxisInterface::callbackDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString) 
{
  std::cout << "describe" << resultString << std::endl;
  UsageEnvironment& env = rtspClient->envir();

  char* const sdpDescription = resultString;
  ((MyRTSPClient*)rtspClient)->session_ = MediaSession::createNew(env, sdpDescription);
  ((MyRTSPClient*)rtspClient)->sessionStarted_ = true;

  if(((MyRTSPClient*)rtspClient)->session_ == NULL)
    std::cout << "did not create session" << std::endl;
  else
    std::cout << "created session" << std::endl;

  rtspClient->sendPauseCommand(*((MyRTSPClient*)rtspClient)->session_, &callbackPAUSEPLAY);
}

void MiniHarvAxisInterface::callbackPAUSEPLAY(RTSPClient* rtspClient, int resultCode, char* resultString)
{
  //do nothing
}

このプロセスで作成したストリームを一時停止して再生することしかできないようです。これはLive555を使用している場合ですか?

4

1 に答える 1