From e7727e7e9b8b3b98fadc0195d1c83b633a24741e Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Tue, 27 Aug 2019 11:34:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=90=E4=BA=9B=E6=B5=81?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2hls=E5=90=8E=E8=8A=B1=E5=B1=8F=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaFile/TsMuxer.cpp | 50 ++++++++++++++++----------------------- src/MediaFile/TsMuxer.h | 6 ++--- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/MediaFile/TsMuxer.cpp b/src/MediaFile/TsMuxer.cpp index 0aa841cf..f0d1092a 100644 --- a/src/MediaFile/TsMuxer.cpp +++ b/src/MediaFile/TsMuxer.cpp @@ -67,38 +67,28 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { switch (frame->getCodecId()){ case CodecH265: case CodecH264: { - - Buffer::Ptr merged_frame ; - if(frame->configFrame()){ - //配置帧,缓存后直接返回,以便下次输入关键帧时使用 - _config_frame_cache.append("\x00\x00\x00\x01",4); - _config_frame_cache.append(frame->data() + frame->prefixSize(),frame->size() - frame->prefixSize()); - break; - } - - if(frame->keyFrame()){ - //关键帧 - if(!_config_frame_cache.empty()){ - //有配置帧,那么配置帧合并关键帧后输入ts打包 - _config_frame_cache.append("\x00\x00\x00\x01",4); - _config_frame_cache.append(frame->data() + frame->prefixSize(),frame->size() - frame->prefixSize()); - merged_frame = std::make_shared(std::move(_config_frame_cache)); - _config_frame_cache.clear(); - }else{ - //这是非第一个的关键帧(h265有多种关键帧) - merged_frame = frame; + //这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理, + if (!_frameCached.empty() && _frameCached.back()->dts() != frame->dts()) { + Frame::Ptr back = _frameCached.back(); + Buffer::Ptr merged_frame = back; + if(_frameCached.size() != 1){ + string merged; + _frameCached.for_each([&](const Frame::Ptr &frame){ + if(frame->prefixSize()){ + merged.append(frame->data(),frame->size()); + } else{ + merged.append("\x00\x00\x00\x01",4); + merged.append(frame->data(),frame->size()); + } + }); + merged_frame = std::make_shared(std::move(merged)); } - }else{ - //这里是普通帧,例如B/P, - merged_frame = frame; - //sps、pps这些配置帧清空掉 - _config_frame_cache.clear(); + track_info.stamp.revise(back->dts(),back->pts(),dts_out,pts_out); + _timestamp = dts_out; + mpeg_ts_write(_context, track_info.track_id, back->keyFrame() ? 0x0001 : 0, pts_out * 90LL, dts_out * 90LL, merged_frame->data(), merged_frame->size()); + _frameCached.clear(); } - - //输入到ts文件 - track_info.stamp.revise(frame->dts(),frame->pts(),dts_out,pts_out); - _timestamp = dts_out; - mpeg_ts_write(_context, track_info.track_id, frame->keyFrame() ? 0x0001 : 0, pts_out * 90LL, dts_out * 90LL, merged_frame->data(), merged_frame->size()); + _frameCached.emplace_back(Frame::getCacheAbleFrame(frame)); } break; default: { diff --git a/src/MediaFile/TsMuxer.h b/src/MediaFile/TsMuxer.h index 406111dd..b4ea0fab 100644 --- a/src/MediaFile/TsMuxer.h +++ b/src/MediaFile/TsMuxer.h @@ -42,8 +42,8 @@ class TsMuxer : public MediaSink { public: TsMuxer(); virtual ~TsMuxer(); - void addTrack(const Track::Ptr &track) ; - void inputFrame(const Frame::Ptr &frame) ; + void addTrack(const Track::Ptr &track) 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(); @@ -60,7 +60,7 @@ private: Stamp stamp; }; unordered_map _codec_to_trackid; - string _config_frame_cache; + List _frameCached; }; }//namespace mediakit