如何使用Live555暂停和播放流媒体



我正在使用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是这种情况吗?

是的,这在Live555中是可能的。

默认情况下,除非您重新定义pauseStream函数,否则Live555不会执行任何操作(请参阅下面Live555源代码中pauseStream功能中的注释):

// 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);

您需要根据MediaSession类构造自己的YOURMediaSubsession类,以重新定义pauseStream函数,如上图所示,然后执行暂停,而不是live555。它应该看起来更像:

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

最新更新