整理MediaSource派生类

修复转协议或录制时忽然Track的问题
This commit is contained in:
xiongziliang
2019-12-26 11:53:19 +08:00
parent 806747a9d5
commit 3830792c57
15 changed files with 172 additions and 150 deletions

View File

@@ -220,14 +220,12 @@ private:
//保存NoticeCenter的强引用防止在MediaSourceWatcher单例释放前释放NoticeCenter单例
_notice_center = NoticeCenter::Instance().shared_from_this();
_notice_center->addListener(this,Broadcast::kBroadcastMediaChanged,[this](BroadcastMediaChangedArgs){
if(bRegist){
onRegist(sender);
}else{
onUnRegist(sender);
if(!bRegist){
removeRecorder(sender);
}
});
_notice_center->addListener(this,Broadcast::kBroadcastMediaResetTracks,[this](BroadcastMediaResetTracksArgs){
onRegist(sender);
addRecorder(sender);
});
}
@@ -236,7 +234,7 @@ private:
_notice_center->delListener(this,Broadcast::kBroadcastMediaResetTracks);
}
void onRegist(MediaSource &sender){
void addRecorder(MediaSource &sender){
auto key = getRecorderKey(sender.getVhost(),sender.getApp(),sender.getId());
lock_guard<decltype(_recorder_mtx)> lck(_recorder_mtx);
auto it = _recorder_map.find(key);
@@ -247,14 +245,14 @@ private:
if(!it->second->isRecording() || it->second->getSchema() == sender.getSchema()){
// 绑定的协议一致或者并未正在录制则替换tracks
auto tracks = sender.getTracks(true);
auto tracks = sender.getTracks(needTrackReady());
if (!tracks.empty()) {
it->second->attachTracks(std::move(tracks),sender.getSchema());
}
}
}
void onUnRegist(MediaSource &sender){
void removeRecorder(MediaSource &sender){
auto key = getRecorderKey(sender.getVhost(),sender.getApp(),sender.getId());
lock_guard<decltype(_recorder_mtx)> lck(_recorder_mtx);
auto it = _recorder_map.find(key);
@@ -284,7 +282,7 @@ private:
vector<Track::Ptr> findTracks(const string &vhost, const string &app, const string &stream_id,string &schema) {
auto src = MediaSource::find(RTMP_SCHEMA, vhost, app, stream_id);
if (src) {
auto ret = src->getTracks(true);
auto ret = src->getTracks(needTrackReady());
if (!ret.empty()) {
schema = RTMP_SCHEMA;
return std::move(ret);
@@ -294,7 +292,7 @@ private:
src = MediaSource::find(RTSP_SCHEMA, vhost, app, stream_id);
if (src) {
schema = RTSP_SCHEMA;
return src->getTracks(true);
return src->getTracks(needTrackReady());
}
return vector<Track::Ptr>();
}
@@ -320,6 +318,20 @@ private:
}
return ret;
}
/**
* 有些录制类型不需要track就绪即可录制
*/
bool needTrackReady(){
switch (type){
case Recorder::type_hls:
return false;
case Recorder::type_mp4:
return true;
default:
return true;
}
}
private:
recursive_mutex _recorder_mtx;
NoticeCenter::Ptr _notice_center;