diff --git a/src/Record/MP4Demuxer.h b/src/Record/MP4Demuxer.h index 166a1770..7cc65197 100644 --- a/src/Record/MP4Demuxer.h +++ b/src/Record/MP4Demuxer.h @@ -71,7 +71,7 @@ private: MP4FileDisk::Ptr _mp4_file; MP4FileDisk::Reader _mov_reader; uint64_t _duration_ms = 0; - std::map _track_to_codec; + std::unordered_map _track_to_codec; toolkit::ResourcePool _buffer_pool; }; diff --git a/src/Record/MPEG.cpp b/src/Record/MPEG.cpp index 82ec8191..ef844277 100644 --- a/src/Record/MPEG.cpp +++ b/src/Record/MPEG.cpp @@ -18,7 +18,7 @@ using namespace toolkit; -namespace mediakit{ +namespace mediakit { MpegMuxer::MpegMuxer(bool is_ps) { _is_ps = is_ps; @@ -40,27 +40,27 @@ bool MpegMuxer::addTrack(const Track::Ptr &track) { if (track->getTrackType() == TrackVideo) { _have_video = true; } - _codec_to_trackid[track->getCodecId()] = mpeg_muxer_add_stream((::mpeg_muxer_t *)_context, mpeg_id, nullptr, 0); + _tracks[track->getIndex()].track_id = mpeg_muxer_add_stream((::mpeg_muxer_t *)_context, mpeg_id, nullptr, 0); return true; } bool MpegMuxer::inputFrame(const Frame::Ptr &frame) { - auto it = _codec_to_trackid.find(frame->getCodecId()); - if (it == _codec_to_trackid.end()) { + auto it = _tracks.find(frame->getIndex()); + if (it == _tracks.end()) { return false; } - auto track_id = it->second; + auto &track = it->second; _key_pos = !_have_video; switch (frame->getCodecId()) { case CodecH264: case CodecH265: { - //这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理, - return _frame_merger.inputFrame(frame,[this, track_id](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) { + // 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理, + return track.merger.inputFrame(frame, [&](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) { _key_pos = have_idr; - //取视频时间戳为TS的时间戳 + // 取视频时间戳为TS的时间戳 _timestamp = dts; _max_cache_size = 512 + 1.2 * buffer->size(); - mpeg_muxer_input((::mpeg_muxer_t *)_context, track_id, have_idr ? 0x0001 : 0, pts * 90LL,dts * 90LL, buffer->data(), buffer->size()); + mpeg_muxer_input((::mpeg_muxer_t *)_context, track.track_id, have_idr ? 0x0001 : 0, pts * 90LL, dts * 90LL, buffer->data(), buffer->size()); flushCache(); }); } @@ -80,7 +80,7 @@ bool MpegMuxer::inputFrame(const Frame::Ptr &frame) { _timestamp = frame->dts(); } _max_cache_size = 512 + 1.2 * frame->size(); - mpeg_muxer_input((::mpeg_muxer_t *)_context, track_id, frame->keyFrame() ? 0x0001 : 0, frame->pts() * 90LL, frame->dts() * 90LL, frame->data(), frame->size()); + mpeg_muxer_input((::mpeg_muxer_t *)_context, track.track_id, frame->keyFrame() ? 0x0001 : 0, frame->pts() * 90LL, frame->dts() * 90LL, frame->data(), frame->size()); flushCache(); return true; } @@ -103,7 +103,6 @@ void MpegMuxer::createContext() { if (!thiz->_current_buffer || thiz->_current_buffer->size() + bytes > thiz->_current_buffer->getCapacity()) { if (thiz->_current_buffer) { - //WarnL << "need realloc mpeg buffer" << thiz->_current_buffer->size() + bytes << " > " << thiz->_current_buffer->getCapacity(); thiz->flushCache(); } thiz->_current_buffer = thiz->_buffer_pool.obtain2(); @@ -143,12 +142,13 @@ void MpegMuxer::releaseContext() { mpeg_muxer_destroy((::mpeg_muxer_t *)_context); _context = nullptr; } - _codec_to_trackid.clear(); - _frame_merger.clear(); + _tracks.clear(); } void MpegMuxer::flush() { - _frame_merger.flush(); + for (auto &pr : _tracks) { + pr.second.merger.flush(); + } } }//mediakit diff --git a/src/Record/MPEG.h b/src/Record/MPEG.h index b1507fc9..dc07af4a 100644 --- a/src/Record/MPEG.h +++ b/src/Record/MPEG.h @@ -70,8 +70,17 @@ private: uint32_t _max_cache_size = 0; uint64_t _timestamp = 0; struct mpeg_muxer_t *_context = nullptr; - std::unordered_map _codec_to_trackid; - FrameMerger _frame_merger{FrameMerger::h264_prefix}; + + class FrameMergerImp : public FrameMerger { + public: + FrameMergerImp() : FrameMerger(FrameMerger::h264_prefix) {} + }; + + struct MP4Track { + int track_id = -1; + FrameMergerImp merger; + }; + std::unordered_map _tracks; toolkit::BufferRaw::Ptr _current_buffer; toolkit::ResourcePool _buffer_pool; }; diff --git a/src/Rtp/Decoder.h b/src/Rtp/Decoder.h index 48a72a78..0ff7549b 100644 --- a/src/Rtp/Decoder.h +++ b/src/Rtp/Decoder.h @@ -11,7 +11,6 @@ #ifndef ZLMEDIAKIT_DECODER_H #define ZLMEDIAKIT_DECODER_H -#include #include #include #include @@ -65,7 +64,7 @@ private: public: FrameMergerImp() : FrameMerger(FrameMerger::none) {} }; - std::map > _tracks; + std::unordered_map > _tracks; }; }//namespace mediakit