添加断流重连是否接着前一次继续写;修复断流重连成功后hls时间戳错误问题

This commit is contained in:
Weiwei.Zhou
2019-10-11 16:51:10 +08:00
parent 7d76a3eb9b
commit d6e60e0919
14 changed files with 109 additions and 26 deletions

View File

@@ -32,7 +32,7 @@ namespace mediakit{
void MediaSink::addTrack(const Track::Ptr &track_in) {
lock_guard<recursive_mutex> lck(_mtx);
//克隆Track只拷贝其数据不拷贝其数据转发关系
//克隆Track只拷贝其数据不拷贝其数据转发关系
auto track = track_in->clone();
weak_ptr<MediaSink> weakSelf = shared_from_this();
@@ -60,6 +60,14 @@ void MediaSink::addTrack(const Track::Ptr &track_in) {
}
}
void MediaSink::resetTracks() {
_anyTrackUnReady = true;
_allTrackReady = false;
_track_map.clear();
_trackReadyCallback.clear();
_ticker.resetTime();
}
void MediaSink::inputFrame(const Frame::Ptr &frame) {
lock_guard<recursive_mutex> lck(_mtx);
auto codec_id = frame->getCodecId();

View File

@@ -52,7 +52,7 @@ public:
* 输入frame
* @param frame
*/
void inputFrame(const Frame::Ptr &frame) override ;
void inputFrame(const Frame::Ptr &frame) override;
/**
* 添加track内部会调用Track的clone方法
@@ -61,21 +61,24 @@ public:
*/
virtual void addTrack(const Track::Ptr & track);
/**
* 重置track
*/
virtual void resetTracks();
/**
* 全部Track是否都准备好了
* @return
*/
bool isAllTrackReady() const ;
bool isAllTrackReady() const;
/**
* 获取特定类型的Track
* @param type track类型
* @param trackReady 是否获取已经准备好的Track
* @param trackReady 是否获取已经准备好的Track
* @return
*/
Track::Ptr getTrack(TrackType type,bool trackReady = true) const ;
Track::Ptr getTrack(TrackType type,bool trackReady = true) const;
protected:
/**
* 某track已经准备好其ready()状态返回true

View File

@@ -69,6 +69,19 @@ public:
_record->addTrack(track);
}
/**
* 重置音视频媒体
*/
void resetTracks() {
if(_rtmp){
_rtmp->resetTracks();
}
if(_rtsp){
_rtsp->resetTracks();
}
_record->resetTracks();
}
/**
* 写入帧数据然后打包rtmp
* @param frame 帧数据

View File

@@ -78,6 +78,7 @@ const string kMaxStreamWaitTimeMS = GENERAL_FIELD"maxStreamWaitMS";
const string kEnableVhost = GENERAL_FIELD"enableVhost";
const string kUltraLowDelay = GENERAL_FIELD"ultraLowDelay";
const string kAddMuteAudio = GENERAL_FIELD"addMuteAudio";
const string kResetWhenRePlay = GENERAL_FIELD"resetWhenRePlay";
onceToken token([](){
mINI::Instance()[kFlowThreshold] = 1024;
@@ -86,6 +87,7 @@ onceToken token([](){
mINI::Instance()[kEnableVhost] = 1;
mINI::Instance()[kUltraLowDelay] = 1;
mINI::Instance()[kAddMuteAudio] = 1;
mINI::Instance()[kResetWhenRePlay] = 1;
},nullptr);
}//namespace General

View File

@@ -179,6 +179,9 @@ extern const string kEnableVhost;
extern const string kUltraLowDelay;
//拉流代理时是否添加静音音频
extern const string kAddMuteAudio;
//拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始,
//如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写)
extern const string kResetWhenRePlay;
}//namespace General