Как поставить на паузу и воспроизвести трансляцию с помощью Live555

Я получаю доступ к видеосерверу с Live555, который транслируется в другую программу. Я хочу отправить команды RTSP PAUSE и PLAY на видеосервер, чтобы остановить потоковую передачу в любую другую программу. Это возможно? Мой код, похоже, ничего не делает. Я могу подключиться к серверу, и сервер проверяет, что я получил полную команду PAUSE:

Видеосервер.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);
};

Видеосервер.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?


person jadams    schedule 09.10.2012    source источник


Ответы (1)


Да, это возможно в Live555.

По умолчанию Live555 ничего не делает, пока вы не переопределите функцию pauseStream (см. комментарий к функции pauseStream в исходном коде Live555 ниже):

// default implementation: do nothing

Вы должны создать свой собственный класс сеанса и переопределить функцию pauseStream, как показано в примере ниже:

Ваш файл мультимедийной сессии .h должен выглядеть примерно так:

#include <MediaSubsession.hh>
class YOURMediaSubsession: public MediaSubsession {

... //You can leave this empty if you like

private:

...

  virtual void pauseStream(unsigned /*clientSessionId*/,void* /*streamToken*/);
};

Файл .cpp сеанса мультимедиа должен выглядеть примерно так:

#include <YOURMediaSubsession.hh>
void YOURMediaSubsession::pauseStream(unsigned /*clientSessionId*/,
                    void* /*streamToken*/) {
  // default implementation: do nothing
}

Вы можете добавить в эту функцию все, что вам нравится, будь то остановка/завершение всех потоков или сохранение кодировщиком кодирования и того же кадра, чтобы создать иллюзию приостановки потока на заранее установленное время. все зависит от вас.

Обратите внимание, что я вижу в вашем коде, что вы используете класс MediaSession по умолчанию, как показано в вашем коде здесь:

((MyRTSPClient*)rtspClient)->session_ = MediaSession::createNew(env, sdpDescription);

Вам нужно будет создать свой собственный класс YOURMediaSubsession на основе класса MediaSession, чтобы переопределить функцию pauseStream, как показано выше, а затем сделать паузу ВЫ, а не live555. Это должно выглядеть примерно так:

((MyRTSPClient*)rtspClient)->session_ = YOURMediaSubsession::createNew(env, sdpDescription);
person ALM865    schedule 12.06.2015