mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-21 08:22:21 +08:00
添加dts生成算法,兼容含B帧的rtsp推流
This commit is contained in:
@@ -42,13 +42,14 @@ int64_t DeltaStamp::deltaStamp(int64_t stamp) {
|
||||
}
|
||||
|
||||
int64_t ret = stamp - _last_stamp;
|
||||
if(ABS(ret) < MAX_DELTA_STAMP){
|
||||
//时间戳变化不明显
|
||||
if(ret >= 0){
|
||||
//时间戳增量为正,返回之
|
||||
_last_stamp = stamp;
|
||||
return ret;
|
||||
//在直播情况下,时间戳增量不得大于MAX_DELTA_STAMP
|
||||
return ret < MAX_DELTA_STAMP ? ret : (_playback ? ret : 0);
|
||||
}
|
||||
|
||||
//时间戳变化太明显,可能回环了或者seek了
|
||||
//时间戳增量为负,说明时间戳回环了或回退了
|
||||
_last_stamp = stamp;
|
||||
return _playback ? ret : 0;
|
||||
}
|
||||
@@ -99,4 +100,52 @@ int64_t Stamp::getRelativeStamp() const {
|
||||
}
|
||||
|
||||
|
||||
bool DtsGenerator::getDts(uint32_t pts, uint32_t &dts){
|
||||
bool ret = false;
|
||||
if(pts == _last_pts){
|
||||
//pts未变,返回上次结果
|
||||
if(_last_dts){
|
||||
dts = _last_dts;
|
||||
ret = true;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = getDts_l(pts,dts);
|
||||
if(ret){
|
||||
//保存本次结果
|
||||
_last_dts = dts;
|
||||
}
|
||||
//记录上次pts
|
||||
_last_pts = pts;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool DtsGenerator::getDts_l(uint32_t pts, uint32_t &dts){
|
||||
if(pts > _last_max_pts){
|
||||
if(!_sorter_max_size && _frames_since_last_max_pts && _count_sorter_max_size++ > 0){
|
||||
_sorter_max_size = _frames_since_last_max_pts;
|
||||
_dts_pts_offset = (pts - _last_max_pts) / 2;
|
||||
InfoL << _sorter_max_size << " " << _dts_pts_offset;
|
||||
}
|
||||
_frames_since_last_max_pts = 0;
|
||||
_last_max_pts = pts;
|
||||
}
|
||||
|
||||
_pts_sorter.emplace(pts);
|
||||
++_frames_since_last_max_pts;
|
||||
|
||||
if(_sorter_max_size && _pts_sorter.size() > _sorter_max_size){
|
||||
auto it = _pts_sorter.begin();
|
||||
dts = *it + _dts_pts_offset;
|
||||
if(dts > pts){
|
||||
//dts不能大于pts(基本不可能到达这个逻辑)
|
||||
dts = pts;
|
||||
}
|
||||
_pts_sorter.erase(it);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}//namespace mediakit
|
||||
Reference in New Issue
Block a user