mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-26 11:52:22 +08:00
优化音视频同步
This commit is contained in:
@@ -42,8 +42,8 @@ void Stamp::setPlayBack(bool playback) {
|
||||
_playback = playback;
|
||||
}
|
||||
|
||||
void Stamp::makeRelation(Stamp &other){
|
||||
_related = &other;
|
||||
void Stamp::syncTo(Stamp &other){
|
||||
_sync_master = &other;
|
||||
}
|
||||
|
||||
void Stamp::revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out,bool modifyStamp) {
|
||||
@@ -53,23 +53,21 @@ void Stamp::revise(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_out,
|
||||
return;
|
||||
}
|
||||
|
||||
if(_related && _related->_last_dts){
|
||||
if(_sync_master && _sync_master->_last_dts){
|
||||
//音视频dts当前时间差
|
||||
int64_t dts_diff = _last_dts - _related->_last_dts;
|
||||
int64_t dts_diff = _last_dts - _sync_master->_last_dts;
|
||||
if(ABS(dts_diff) < 5000){
|
||||
//如果绝对时间戳小于5秒,那么说明他们的起始时间戳是一致的,那么强制同步
|
||||
_last_relativeStamp = _relativeStamp;
|
||||
_relativeStamp = _related->_relativeStamp + dts_diff;
|
||||
dts_out += dts_diff;
|
||||
pts_out += dts_diff;
|
||||
// DebugL << "音视频同步事件差:" << dts_diff;
|
||||
_relativeStamp = _sync_master->_relativeStamp + dts_diff;
|
||||
}
|
||||
//下次不用再强制同步
|
||||
_related = nullptr;
|
||||
_sync_master = nullptr;
|
||||
}
|
||||
|
||||
if(dts_out < 0){
|
||||
//相对时间戳小于0,那么说明是同步时间戳导致的,在这个过渡期内,我们一直返回上次的结果(目的是为了防止时间戳回退)
|
||||
if(dts_out < 0 || dts_out < _last_relativeStamp){
|
||||
//相对时间戳小于0,或者小于上次的时间戳,
|
||||
//那么说明是同步时间戳导致的,在这个过渡期内,我们一直返回上次的结果(目的是为了防止时间戳回退)
|
||||
pts_out = _last_relativeStamp + (pts_out - dts_out);
|
||||
dts_out = _last_relativeStamp;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user