diff --git a/src/Common/MediaSource.cpp b/src/Common/MediaSource.cpp index 048b5609..3523eede 100644 --- a/src/Common/MediaSource.cpp +++ b/src/Common/MediaSource.cpp @@ -724,6 +724,14 @@ std::shared_ptr MediaSourceEventInterceptor::getDelegate() con /////////////////////////////////////FlushPolicy////////////////////////////////////// +template<> +bool PacketCache::flushImmediatelyWhenCloseMerge() { + //因为rtp的包很小,一个RtpPacket包中也不是完整的一帧图像,所以在关闭合并写时, + //还是有必要缓冲一帧的rtp(也就是时间戳相同的rtp)再输出,这样虽然会增加一帧的延时 + //但是却对性能提升很大,这样做还是比较划算的 + return false; +} + static bool isFlushAble_default(bool is_video, uint64_t last_stamp, uint64_t new_stamp, size_t cache_size) { if (new_stamp + 500 < last_stamp) { //时间戳回退比较大(可能seek中),由于rtp中时间戳是pts,是可能存在一定程度的回退的 diff --git a/src/Common/MediaSource.h b/src/Common/MediaSource.h index d77fbe25..91232ffd 100644 --- a/src/Common/MediaSource.h +++ b/src/Common/MediaSource.h @@ -342,7 +342,8 @@ public: virtual ~PacketCache() = default; void inputPacket(uint64_t stamp, bool is_video, std::shared_ptr pkt, bool key_pos) { - if (_policy.isFlushAble(is_video, key_pos, stamp, _cache->size())) { + bool flush = flushImmediatelyWhenCloseMerge(); + if (!flush && _policy.isFlushAble(is_video, key_pos, stamp, _cache->size())) { flushAll(); } @@ -351,6 +352,10 @@ public: if (key_pos) { _key_pos = key_pos; } + + if (flush) { + flushAll(); + } } virtual void clearCache() { @@ -369,6 +374,12 @@ private: _key_pos = false; } + bool flushImmediatelyWhenCloseMerge() { + //一般的协议关闭合并写时,立即刷新缓存,这样可以减少一帧的延时,但是rtp例外,请看相应的模板特例化函数 + GET_CONFIG(int, mergeWriteMS, General::kMergeWriteMS); + return mergeWriteMS <= 0; + } + private: bool _key_pos = false; policy _policy;