mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 04:31:37 +08:00
非rtsp协议减少一帧延时
This commit is contained in:
parent
2242577661
commit
04bf829540
@ -724,6 +724,14 @@ std::shared_ptr<MediaSourceEvent> MediaSourceEventInterceptor::getDelegate() con
|
|||||||
|
|
||||||
/////////////////////////////////////FlushPolicy//////////////////////////////////////
|
/////////////////////////////////////FlushPolicy//////////////////////////////////////
|
||||||
|
|
||||||
|
template<>
|
||||||
|
bool PacketCache<RtpPacket>::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) {
|
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) {
|
if (new_stamp + 500 < last_stamp) {
|
||||||
//时间戳回退比较大(可能seek中),由于rtp中时间戳是pts,是可能存在一定程度的回退的
|
//时间戳回退比较大(可能seek中),由于rtp中时间戳是pts,是可能存在一定程度的回退的
|
||||||
|
@ -342,7 +342,8 @@ public:
|
|||||||
virtual ~PacketCache() = default;
|
virtual ~PacketCache() = default;
|
||||||
|
|
||||||
void inputPacket(uint64_t stamp, bool is_video, std::shared_ptr<packet> pkt, bool key_pos) {
|
void inputPacket(uint64_t stamp, bool is_video, std::shared_ptr<packet> 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();
|
flushAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -351,6 +352,10 @@ public:
|
|||||||
if (key_pos) {
|
if (key_pos) {
|
||||||
_key_pos = key_pos;
|
_key_pos = key_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flush) {
|
||||||
|
flushAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void clearCache() {
|
virtual void clearCache() {
|
||||||
@ -369,6 +374,12 @@ private:
|
|||||||
_key_pos = false;
|
_key_pos = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool flushImmediatelyWhenCloseMerge() {
|
||||||
|
//一般的协议关闭合并写时,立即刷新缓存,这样可以减少一帧的延时,但是rtp例外,请看相应的模板特例化函数
|
||||||
|
GET_CONFIG(int, mergeWriteMS, General::kMergeWriteMS);
|
||||||
|
return mergeWriteMS <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _key_pos = false;
|
bool _key_pos = false;
|
||||||
policy _policy;
|
policy _policy;
|
||||||
|
Loading…
Reference in New Issue
Block a user