diff --git a/src/Common/MultiMediaSourceMuxer.h b/src/Common/MultiMediaSourceMuxer.h index 0cda92dc..7c39e5f8 100644 --- a/src/Common/MultiMediaSourceMuxer.h +++ b/src/Common/MultiMediaSourceMuxer.h @@ -50,31 +50,16 @@ public: _rtsp = std::make_shared(vhost, strApp, strId, std::make_shared(dur_sec)); } - _recordFunc = [bEanbleHls,bEnableMp4,vhost, strApp, strId](bool start){ - if(bEanbleHls){ - if(start){ - Recorder::startRecord(Recorder::type_hls,vhost, strApp, strId, true, false); - }else{ - Recorder::stopRecord(Recorder::type_hls,vhost, strApp, strId); - } - } - - if(bEnableMp4){ - if(start){ - Recorder::startRecord(Recorder::type_mp4,vhost, strApp, strId, true, false); - }else{ - Recorder::stopRecord(Recorder::type_mp4,vhost, strApp, strId); - } - } - }; - - _recordFunc(true); - } - virtual ~MultiMediaSourceMuxer(){ - if(_recordFunc){ - _recordFunc(false); + if(bEanbleHls){ + Recorder::startRecord(Recorder::type_hls,vhost, strApp, strId, true, false); } + + if(bEnableMp4){ + Recorder::startRecord(Recorder::type_mp4,vhost, strApp, strId, true, false); + } + } + virtual ~MultiMediaSourceMuxer(){} /** * 重置音视频媒体 @@ -158,7 +143,6 @@ protected: private: RtmpMediaSourceMuxer::Ptr _rtmp; RtspMediaSourceMuxer::Ptr _rtsp; - function _recordFunc; }; diff --git a/src/Record/Recorder.cpp b/src/Record/Recorder.cpp index ed9dabae..2a1646f1 100644 --- a/src/Record/Recorder.cpp +++ b/src/Record/Recorder.cpp @@ -26,6 +26,7 @@ #include "Recorder.h" #include "Common/config.h" +#include "Common/MediaSource.h" #include "MP4Recorder.h" #include "HlsRecorder.h" @@ -94,10 +95,9 @@ public: * 构建函数 * @param bContinueRecord false表明hls录制从头开始录制(意味着hls临时文件在媒体反注册时会被删除) */ - RecorderHelper(const MediaSinkInterface::Ptr &recorder, vector &&tracks , bool bContinueRecord, const string &schema) { + RecorderHelper(const MediaSinkInterface::Ptr &recorder, bool bContinueRecord) { _recorder = recorder; _continueRecord = bContinueRecord; - attachTracks(std::move(tracks),schema); } ~RecorderHelper() { @@ -197,7 +197,11 @@ public: // 创建录制器失败 return -2; } - _recorder_map[key] = std::make_shared(recorder, std::move(tracks), continueRecord, schema); + auto helper = std::make_shared(recorder, continueRecord); + if(tracks.size()){ + helper->attachTracks(std::move(tracks),schema); + } + _recorder_map[key] = std::move(helper); return 0; } @@ -239,32 +243,24 @@ private: return; } - auto tracks = sender.getTracks(true); - if (tracks.empty()) { - // 无有效的tracks - return; - } - if(!it->second->isRecording() || it->second->getSchema() == schema){ - // 绑定的协议一致,替换tracks - it->second->attachTracks(std::move(tracks),schema); + // 绑定的协议一致或者并未正在录制则替换tracks + auto tracks = sender.getTracks(true); + if (!tracks.empty()) { + it->second->attachTracks(std::move(tracks),schema); + } } - } void onUnRegist(const string &schema,const string &vhost,const string &app,const string &stream,MediaSource &sender){ auto key = getRecorderKey(vhost,app,stream); lock_guard lck(_recorder_mtx); auto it = _recorder_map.find(key); - if(it == _recorder_map.end()){ - // 录像记录不存在 + if(it == _recorder_map.end() || it->second->getSchema() != schema){ + // 录像记录不存在或绑定的协议不一致 return; } - if(it->second->getSchema() != schema){ - // 绑定的协议不一致 - return; - } if(it->second->continueRecord()){ // 如果可以继续录制,那么只重置tracks,不删除对象 it->second->resetTracks(); @@ -318,7 +314,7 @@ private: break; } if(!ret){ - WarnL << "can not recorder of: " << type; + WarnL << "can not create recorder of type: " << type; } return ret; } @@ -345,6 +341,7 @@ int Recorder::startRecord(Recorder::type type, const string &vhost, const string case type_hls: return MediaSourceWatcher::Instance().startRecord(vhost,app,stream_id,waitForRecord,continueRecord); } + WarnL << "unknown record type: " << type; return -3; } diff --git a/src/Record/Recorder.h b/src/Record/Recorder.h index a18e7bbd..64d3af9a 100644 --- a/src/Record/Recorder.h +++ b/src/Record/Recorder.h @@ -53,9 +53,40 @@ public: type_mp4 = 1 } type; + /** + * 获取录制状态 + * @param type hls还是MP4录制 + * @param vhost 虚拟主机 + * @param app 应用名 + * @param stream_id 流id + * @return 录制状态 + */ static status getRecordStatus(type type, const string &vhost, const string &app, const string &stream_id); + + /** + * 开始录制 + * @param type hls还是MP4录制 + * @param vhost 虚拟主机 + * @param app 应用名 + * @param stream_id 流id + * @param waitForRecord 是否等待流注册后再录制,未注册时,置false将返回失败 + * @param continueRecord 流注销时是否继续等待录制还是立即停止注册 + * @return 0代表成功,负数代表失败 + */ static int startRecord(type type, const string &vhost, const string &app, const string &stream_id,bool waitForRecord, bool continueRecord); + + /** + * 停止录制 + * @param type hls还是MP4录制 + * @param vhost 虚拟主机 + * @param app 应用名 + * @param stream_id 流id + */ static void stopRecord(type type, const string &vhost, const string &app, const string &stream_id); + + /** + * 停止所有录制,一般程序退出时调用 + */ static void stopAll(); private: Recorder() = delete;