优化精简录制相关代码
This commit is contained in:
parent
6eb4d5916d
commit
f581f0f2a7
|
|
@ -50,31 +50,16 @@ public:
|
||||||
_rtsp = std::make_shared<RtspMediaSourceMuxer>(vhost, strApp, strId, std::make_shared<TitleSdp>(dur_sec));
|
_rtsp = std::make_shared<RtspMediaSourceMuxer>(vhost, strApp, strId, std::make_shared<TitleSdp>(dur_sec));
|
||||||
}
|
}
|
||||||
|
|
||||||
_recordFunc = [bEanbleHls,bEnableMp4,vhost, strApp, strId](bool start){
|
|
||||||
if(bEanbleHls){
|
if(bEanbleHls){
|
||||||
if(start){
|
|
||||||
Recorder::startRecord(Recorder::type_hls,vhost, strApp, strId, true, false);
|
Recorder::startRecord(Recorder::type_hls,vhost, strApp, strId, true, false);
|
||||||
}else{
|
|
||||||
Recorder::stopRecord(Recorder::type_hls,vhost, strApp, strId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(bEnableMp4){
|
if(bEnableMp4){
|
||||||
if(start){
|
|
||||||
Recorder::startRecord(Recorder::type_mp4,vhost, strApp, strId, true, false);
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
virtual ~MultiMediaSourceMuxer(){}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 重置音视频媒体
|
* 重置音视频媒体
|
||||||
|
|
@ -158,7 +143,6 @@ protected:
|
||||||
private:
|
private:
|
||||||
RtmpMediaSourceMuxer::Ptr _rtmp;
|
RtmpMediaSourceMuxer::Ptr _rtmp;
|
||||||
RtspMediaSourceMuxer::Ptr _rtsp;
|
RtspMediaSourceMuxer::Ptr _rtsp;
|
||||||
function<void(bool)> _recordFunc;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "Recorder.h"
|
#include "Recorder.h"
|
||||||
#include "Common/config.h"
|
#include "Common/config.h"
|
||||||
|
#include "Common/MediaSource.h"
|
||||||
#include "MP4Recorder.h"
|
#include "MP4Recorder.h"
|
||||||
#include "HlsRecorder.h"
|
#include "HlsRecorder.h"
|
||||||
|
|
||||||
|
|
@ -94,10 +95,9 @@ public:
|
||||||
* 构建函数
|
* 构建函数
|
||||||
* @param bContinueRecord false表明hls录制从头开始录制(意味着hls临时文件在媒体反注册时会被删除)
|
* @param bContinueRecord false表明hls录制从头开始录制(意味着hls临时文件在媒体反注册时会被删除)
|
||||||
*/
|
*/
|
||||||
RecorderHelper(const MediaSinkInterface::Ptr &recorder, vector<Track::Ptr> &&tracks , bool bContinueRecord, const string &schema) {
|
RecorderHelper(const MediaSinkInterface::Ptr &recorder, bool bContinueRecord) {
|
||||||
_recorder = recorder;
|
_recorder = recorder;
|
||||||
_continueRecord = bContinueRecord;
|
_continueRecord = bContinueRecord;
|
||||||
attachTracks(std::move(tracks),schema);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~RecorderHelper() {
|
~RecorderHelper() {
|
||||||
|
|
@ -197,7 +197,11 @@ public:
|
||||||
// 创建录制器失败
|
// 创建录制器失败
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
_recorder_map[key] = std::make_shared<RecorderHelper>(recorder, std::move(tracks), continueRecord, schema);
|
auto helper = std::make_shared<RecorderHelper>(recorder, continueRecord);
|
||||||
|
if(tracks.size()){
|
||||||
|
helper->attachTracks(std::move(tracks),schema);
|
||||||
|
}
|
||||||
|
_recorder_map[key] = std::move(helper);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -239,32 +243,24 @@ private:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto tracks = sender.getTracks(true);
|
|
||||||
if (tracks.empty()) {
|
|
||||||
// 无有效的tracks
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!it->second->isRecording() || it->second->getSchema() == schema){
|
if(!it->second->isRecording() || it->second->getSchema() == schema){
|
||||||
// 绑定的协议一致,替换tracks
|
// 绑定的协议一致或者并未正在录制则替换tracks
|
||||||
|
auto tracks = sender.getTracks(true);
|
||||||
|
if (!tracks.empty()) {
|
||||||
it->second->attachTracks(std::move(tracks),schema);
|
it->second->attachTracks(std::move(tracks),schema);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onUnRegist(const string &schema,const string &vhost,const string &app,const string &stream,MediaSource &sender){
|
void onUnRegist(const string &schema,const string &vhost,const string &app,const string &stream,MediaSource &sender){
|
||||||
auto key = getRecorderKey(vhost,app,stream);
|
auto key = getRecorderKey(vhost,app,stream);
|
||||||
lock_guard<decltype(_recorder_mtx)> lck(_recorder_mtx);
|
lock_guard<decltype(_recorder_mtx)> lck(_recorder_mtx);
|
||||||
auto it = _recorder_map.find(key);
|
auto it = _recorder_map.find(key);
|
||||||
if(it == _recorder_map.end()){
|
if(it == _recorder_map.end() || it->second->getSchema() != schema){
|
||||||
// 录像记录不存在
|
// 录像记录不存在或绑定的协议不一致
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(it->second->getSchema() != schema){
|
|
||||||
// 绑定的协议不一致
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(it->second->continueRecord()){
|
if(it->second->continueRecord()){
|
||||||
// 如果可以继续录制,那么只重置tracks,不删除对象
|
// 如果可以继续录制,那么只重置tracks,不删除对象
|
||||||
it->second->resetTracks();
|
it->second->resetTracks();
|
||||||
|
|
@ -318,7 +314,7 @@ private:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(!ret){
|
if(!ret){
|
||||||
WarnL << "can not recorder of: " << type;
|
WarnL << "can not create recorder of type: " << type;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
@ -345,6 +341,7 @@ int Recorder::startRecord(Recorder::type type, const string &vhost, const string
|
||||||
case type_hls:
|
case type_hls:
|
||||||
return MediaSourceWatcher<type_hls>::Instance().startRecord(vhost,app,stream_id,waitForRecord,continueRecord);
|
return MediaSourceWatcher<type_hls>::Instance().startRecord(vhost,app,stream_id,waitForRecord,continueRecord);
|
||||||
}
|
}
|
||||||
|
WarnL << "unknown record type: " << type;
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,9 +53,40 @@ public:
|
||||||
type_mp4 = 1
|
type_mp4 = 1
|
||||||
} type;
|
} 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);
|
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);
|
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 stopRecord(type type, const string &vhost, const string &app, const string &stream_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止所有录制,一般程序退出时调用
|
||||||
|
*/
|
||||||
static void stopAll();
|
static void stopAll();
|
||||||
private:
|
private:
|
||||||
Recorder() = delete;
|
Recorder() = delete;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue