添加断流重连是否接着前一次继续写;修复断流重连成功后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

@@ -81,8 +81,18 @@ void HlsMaker::makeIndexFile(bool eof) {
void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) {
addNewFile(timestamp);
onWriteFile((char *) data, len);
//分片数据中断结束
if (data && len) {
addNewFile(timestamp);
onWriteFile((char *) data, len);
}
else {
_noData = true;
_stampInc = _ticker.elapsedTime();
_seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name));
delOldFile();
makeIndexFile();
}
}
void HlsMaker::delOldFile() {
@@ -102,6 +112,12 @@ void HlsMaker::delOldFile() {
}
void HlsMaker::addNewFile(uint32_t) {
//上次分片数据中断结束,重置时间避免中途的等待
if (_noData) {
_ticker.resetTime();
_last_file_name = onOpenFile(_file_index++);
_noData = false;
}
_stampInc = _ticker.elapsedTime();
if (_file_index == 0 || _stampInc >= _seg_duration * 1000) {
_ticker.resetTime();

View File

@@ -92,6 +92,7 @@ protected:
protected:
uint32_t _seg_number = 0;
private:
bool _noData = false;
int _stampInc = 0;
float _seg_duration = 0;
uint64_t _file_index = 0;

View File

@@ -32,7 +32,7 @@
namespace mediakit {
class HlsRecorder : public HlsMakerImp , public TsMuxer {
class HlsRecorder : public HlsMakerImp, public TsMuxer {
public:
template<typename ...ArgsType>
HlsRecorder(ArgsType &&...args):HlsMakerImp(std::forward<ArgsType>(args)...){}

View File

@@ -113,4 +113,18 @@ void MediaRecorder::addTrack(const Track::Ptr &track) {
#endif //defined(ENABLE_MP4RECORD)
}
void MediaRecorder::resetTracks() {
#if defined(ENABLE_HLS)
if (_hlsRecorder) {
_hlsRecorder->resetTracks();
}
#endif //defined(ENABLE_HLS)
#if defined(ENABLE_MP4RECORD)
if (_mp4Recorder) {
_mp4Recorder->resetTracks();
}
#endif //defined(ENABLE_MP4RECORD)
}
} /* namespace mediakit */

View File

@@ -48,17 +48,22 @@ public:
virtual ~MediaRecorder();
/**
* 输入frame
* @param frame
*/
void inputFrame(const Frame::Ptr &frame) override ;
* 输入frame
* @param frame
*/
void inputFrame(const Frame::Ptr &frame) override;
/**
* 添加track内部会调用Track的clone方法
* 只会克隆sps pps这些信息 而不会克隆Delegate相关关系
* @param track
*/
* 添加track内部会调用Track的clone方法
* 只会克隆sps pps这些信息 而不会克隆Delegate相关关系
* @param track
*/
void addTrack(const Track::Ptr & track) override;
/**
* 重置track
*/
void resetTracks() override;
private:
#if defined(ENABLE_HLS)
std::shared_ptr<HlsRecorder> _hlsRecorder;

View File

@@ -101,6 +101,8 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
}
void TsMuxer::resetTracks() {
//通知片段中断
onTs(nullptr, 0, 0, 0);
uninit();
init();
}

View File

@@ -43,10 +43,10 @@ public:
TsMuxer();
virtual ~TsMuxer();
void addTrack(const Track::Ptr &track) override;
void inputFrame(const Frame::Ptr &frame) override;
void resetTracks() override;
void inputFrame(const Frame::Ptr &frame) override;
protected:
virtual void onTs(const void *packet, int bytes,uint32_t timestamp,int flags) = 0;
void resetTracks();
private:
void init();
void uninit();