添加对rtmp play2命令的支持

This commit is contained in:
xzl 2017-05-18 16:24:36 +08:00
parent 6d28fff604
commit 9ef5a11579
2 changed files with 26 additions and 17 deletions

View File

@ -21,6 +21,7 @@ RtmpSession::RtmpSession(const std::shared_ptr<ThreadPool> &pTh, const Socket::P
g_mapCmd.emplace("publish",&RtmpSession::onCmd_publish); g_mapCmd.emplace("publish",&RtmpSession::onCmd_publish);
g_mapCmd.emplace("deleteStream",&RtmpSession::onCmd_deleteStream); g_mapCmd.emplace("deleteStream",&RtmpSession::onCmd_deleteStream);
g_mapCmd.emplace("play",&RtmpSession::onCmd_play); g_mapCmd.emplace("play",&RtmpSession::onCmd_play);
g_mapCmd.emplace("play2",&RtmpSession::onCmd_play2);
g_mapCmd.emplace("seek",&RtmpSession::onCmd_seek); g_mapCmd.emplace("seek",&RtmpSession::onCmd_seek);
g_mapCmd.emplace("pause",&RtmpSession::onCmd_pause);}, []() {}); g_mapCmd.emplace("pause",&RtmpSession::onCmd_pause);}, []() {});
DebugL << getPeerIp(); DebugL << getPeerIp();
@ -136,13 +137,7 @@ void RtmpSession::onCmd_deleteStream(AMFDecoder &dec) {
throw std::runtime_error(StrPrinter << "Stop publishing." << endl); throw std::runtime_error(StrPrinter << "Stop publishing." << endl);
} }
void RtmpSession::onCmd_play(AMFDecoder &dec) { void RtmpSession::doPlay(){
dec.load<AMFValue>();/* NULL */
m_strId = dec.load<std::string>();
auto iPos = m_strId.find('?');
if (iPos != string::npos) {
m_strId.erase(iPos);
}
auto src = RtmpMediaSource::find(m_strApp,m_strId,true); auto src = RtmpMediaSource::find(m_strApp,m_strId,true);
bool ok = (src.operator bool()); bool ok = (src.operator bool());
ok = ok && src->ready(); ok = ok && src->ready();
@ -150,7 +145,7 @@ void RtmpSession::onCmd_play(AMFDecoder &dec) {
//stream begin //stream begin
sendUserControl(CONTROL_STREAM_BEGIN, STREAM_MEDIA); sendUserControl(CONTROL_STREAM_BEGIN, STREAM_MEDIA);
// onStatus(NetStream.Play.Reset) // onStatus(NetStream.Play.Reset)
AMFValue status(AMF_OBJECT); AMFValue status(AMF_OBJECT);
status.set("level", ok ? "status" : "error"); status.set("level", ok ? "status" : "error");
status.set("code", ok ? "NetStream.Play.Reset" : "NetStream.Play.StreamNotFound"); status.set("code", ok ? "NetStream.Play.Reset" : "NetStream.Play.StreamNotFound");
@ -162,7 +157,7 @@ void RtmpSession::onCmd_play(AMFDecoder &dec) {
throw std::runtime_error( StrPrinter << "No such stream:" << m_strApp << " " << m_strId << endl); throw std::runtime_error( StrPrinter << "No such stream:" << m_strApp << " " << m_strId << endl);
} }
// onStatus(NetStream.Play.Start) // onStatus(NetStream.Play.Start)
status.clear(); status.clear();
status.set("level", "status"); status.set("level", "status");
status.set("code", "NetStream.Play.Start"); status.set("code", "NetStream.Play.Start");
@ -171,7 +166,7 @@ void RtmpSession::onCmd_play(AMFDecoder &dec) {
status.set("clientid", "0"); status.set("clientid", "0");
sendReply("onStatus", nullptr, status); sendReply("onStatus", nullptr, status);
// |RtmpSampleAccess(true, true) // |RtmpSampleAccess(true, true)
AMFEncoder invoke; AMFEncoder invoke;
invoke << "|RtmpSampleAccess" << true << true; invoke << "|RtmpSampleAccess" << true << true;
sendResponse(MSG_DATA, invoke.data()); sendResponse(MSG_DATA, invoke.data());
@ -192,15 +187,15 @@ void RtmpSession::onCmd_play(AMFDecoder &dec) {
status.set("clientid", "0"); status.set("clientid", "0");
sendReply("onStatus", nullptr, status); sendReply("onStatus", nullptr, status);
// onMetaData // onMetaData
invoke.clear(); invoke.clear();
invoke << "onMetaData" << src->getMetaData(); invoke << "onMetaData" << src->getMetaData();
sendResponse(MSG_DATA, invoke.data()); sendResponse(MSG_DATA, invoke.data());
src->getConfigFrame([&](const RtmpPacket &pkt) { src->getConfigFrame([&](const RtmpPacket &pkt) {
//DebugL<<"send initial frame"; //DebugL<<"send initial frame";
onSendMedia(pkt); onSendMedia(pkt);
}); });
m_pRingReader = src->getRing()->attach(); m_pRingReader = src->getRing()->attach();
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this()); weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
@ -224,10 +219,22 @@ void RtmpSession::onCmd_play(AMFDecoder &dec) {
} }
strongSelf->safeShutdown(); strongSelf->safeShutdown();
}); });
m_pPlayerSrc = src; m_pPlayerSrc = src;
if(src->getRing()->readerCount() == 1){ if(src->getRing()->readerCount() == 1){
src->seekTo(0); src->seekTo(0);
} }
}
void RtmpSession::onCmd_play2(AMFDecoder &dec) {
doPlay();
}
void RtmpSession::onCmd_play(AMFDecoder &dec) {
dec.load<AMFValue>();/* NULL */
m_strId = dec.load<std::string>();
auto iPos = m_strId.find('?');
if (iPos != string::npos) {
m_strId.erase(iPos);
}
doPlay();
} }
void RtmpSession::onCmd_pause(AMFDecoder &dec) { void RtmpSession::onCmd_pause(AMFDecoder &dec) {

View File

@ -56,6 +56,8 @@ private:
void onCmd_deleteStream(AMFDecoder &dec); void onCmd_deleteStream(AMFDecoder &dec);
void onCmd_play(AMFDecoder &dec); void onCmd_play(AMFDecoder &dec);
void onCmd_play2(AMFDecoder &dec);
void doPlay();
void onCmd_seek(AMFDecoder &dec); void onCmd_seek(AMFDecoder &dec);
void onCmd_pause(AMFDecoder &dec); void onCmd_pause(AMFDecoder &dec);
void setMetaData(AMFDecoder &dec); void setMetaData(AMFDecoder &dec);