From a9539eb62629841408f97f4c40d9862614b34ed5 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 24 Jan 2020 22:00:55 +0800 Subject: [PATCH] =?UTF-8?q?HLS=E9=81=87=E5=88=B0I=E5=B8=A7=E6=89=8D?= =?UTF-8?q?=E5=88=87=E7=89=87:#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Record/HlsMaker.cpp | 8 +++++--- src/Record/HlsMaker.h | 3 ++- src/Record/HlsRecorder.h | 4 ++-- src/Record/TsMuxer.cpp | 22 ++++++++++++++++------ src/Record/TsMuxer.h | 4 +++- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/Record/HlsMaker.cpp b/src/Record/HlsMaker.cpp index 039254b9..704e5f61 100644 --- a/src/Record/HlsMaker.cpp +++ b/src/Record/HlsMaker.cpp @@ -75,14 +75,16 @@ void HlsMaker::makeIndexFile(bool eof) { } -void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) { - //分片数据中断结束 +void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp, bool is_idr_fast_packet) { if (data && len) { - addNewSegment(timestamp); + if(is_idr_fast_packet){ + addNewSegment(timestamp); + } onWriteSegment((char *) data, len); //记录上次写入数据时间 _ticker_last_data.resetTime(); } else { + //resetTracks时触发此逻辑 flushLastSegment(true); } } diff --git a/src/Record/HlsMaker.h b/src/Record/HlsMaker.h index cb7f6b23..12e5dab4 100644 --- a/src/Record/HlsMaker.h +++ b/src/Record/HlsMaker.h @@ -52,8 +52,9 @@ public: * @param data 数据 * @param len 数据长度 * @param timestamp 毫秒时间戳 + * @param is_idr_fast_packet 是否为关键帧第一个包 */ - void inputData(void *data, uint32_t len, uint32_t timestamp); + void inputData(void *data, uint32_t len, uint32_t timestamp, bool is_idr_fast_packet); protected: /** * 创建ts切片文件回调 diff --git a/src/Record/HlsRecorder.h b/src/Record/HlsRecorder.h index 7b1da82b..7bebd20b 100644 --- a/src/Record/HlsRecorder.h +++ b/src/Record/HlsRecorder.h @@ -56,8 +56,8 @@ public: } #if defined(ENABLE_HLS) protected: - void onTs(const void *packet, int bytes,uint32_t timestamp,int flags) override { - _hls->inputData((char *)packet,bytes,timestamp); + void onTs(const void *packet, int bytes,uint32_t timestamp,bool is_idr_fast_packet) override { + _hls->inputData((char *)packet,bytes,timestamp, is_idr_fast_packet); }; #endif private: diff --git a/src/Record/TsMuxer.cpp b/src/Record/TsMuxer.cpp index fe63624b..e63c4f8f 100644 --- a/src/Record/TsMuxer.cpp +++ b/src/Record/TsMuxer.cpp @@ -40,16 +40,21 @@ TsMuxer::~TsMuxer() { } void TsMuxer::addTrack(const Track::Ptr &track) { - switch (track->getCodecId()){ + switch (track->getCodecId()) { case CodecH264: { + _have_video = true; _codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_H264, nullptr, 0); - } break; + } + break; case CodecH265: { + _have_video = true; _codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_H265, nullptr, 0); - }break; + } + break; case CodecAAC: { _codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_AAC, nullptr, 0); - }break; + } + break; default: break; } @@ -63,7 +68,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { //mp4文件时间戳需要从0开始 auto &track_info = it->second; int64_t dts_out, pts_out; - + _is_idr_fast_packet = !_have_video; switch (frame->getCodecId()){ case CodecH265: case CodecH264: { @@ -80,6 +85,9 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { merged.append("\x00\x00\x00\x01",4); merged.append(frame->data(),frame->size()); } + if(frame->keyFrame()){ + _is_idr_fast_packet = true; + } }); merged_frame = std::make_shared(std::move(merged)); } @@ -101,6 +109,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { } void TsMuxer::resetTracks() { + _have_video = false; //通知片段中断 onTs(nullptr, 0, 0, 0); uninit(); @@ -119,7 +128,8 @@ void TsMuxer::init() { }, [](void* param, const void* packet, size_t bytes){ TsMuxer *muxer = (TsMuxer *)param; - muxer->onTs(packet, bytes,muxer->_timestamp,0); + muxer->onTs(packet, bytes,muxer->_timestamp,muxer->_is_idr_fast_packet); + muxer->_is_idr_fast_packet = false; } }; if(_context == nullptr){ diff --git a/src/Record/TsMuxer.h b/src/Record/TsMuxer.h index 26b262cc..b484a864 100644 --- a/src/Record/TsMuxer.h +++ b/src/Record/TsMuxer.h @@ -46,7 +46,7 @@ public: 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; + virtual void onTs(const void *packet, int bytes,uint32_t timestamp,bool is_idr_fast_packet) = 0; private: void init(); void uninit(); @@ -61,6 +61,8 @@ private: }; unordered_map _codec_to_trackid; List _frameCached; + bool _is_idr_fast_packet = false; + bool _have_video = false; }; }//namespace mediakit