mirror of
https://gitee.com/xia-chu/ZLMediaKit.git
synced 2026-05-06 10:57:50 +08:00
优化音视频时间戳同步逻辑
This commit is contained in:
parent
38821b295a
commit
18ca4cf48f
@ -87,13 +87,13 @@ void Stamp::setPlayBack(bool playback) {
|
||||
_playback = playback;
|
||||
}
|
||||
|
||||
void Stamp::syncTo(Stamp &other) {
|
||||
_need_sync = true;
|
||||
void Stamp::syncTo(Stamp &other, int count) {
|
||||
_need_sync += count;
|
||||
_sync_master = &other;
|
||||
}
|
||||
|
||||
void Stamp::needSync() {
|
||||
_need_sync = true;
|
||||
++_need_sync;
|
||||
}
|
||||
|
||||
void Stamp::enableRollback(bool flag) {
|
||||
@ -145,25 +145,42 @@ void Stamp::revise_l(int64_t dts, int64_t pts, int64_t &dts_out, int64_t &pts_ou
|
||||
// 音视频dts当前时间差 [AUTO-TRANSLATED:716468a6]
|
||||
// Audio and video dts current time difference
|
||||
int64_t dts_diff = _last_dts_in - _sync_master->_last_dts_in;
|
||||
if (ABS(dts_diff) < 5000) {
|
||||
if (ABS(dts_diff) < 5000 || _need_sync > 3) {
|
||||
// 两种时间戳相差不得大于300ms
|
||||
dts_diff = _relative_stamp - _sync_master->_relative_stamp;
|
||||
if (dts_diff > 300) {
|
||||
dts_diff = 300;
|
||||
} else if (dts_diff < -300) {
|
||||
dts_diff = -300;
|
||||
}
|
||||
// 如果绝对时间戳小于5秒,那么说明他们的起始时间戳是一致的,那么强制同步 [AUTO-TRANSLATED:5d11ef6a]
|
||||
// If the absolute timestamp is less than 5 seconds, then it means that their starting timestamps are consistent, then force synchronization
|
||||
auto target_stamp = _sync_master->_relative_stamp + dts_diff;
|
||||
if (target_stamp > _relative_stamp || _enable_rollback) {
|
||||
// 强制同步后,时间戳增加跳跃了,或允许回退 [AUTO-TRANSLATED:805424a9]
|
||||
// After forced synchronization, the timestamp increases jump, or allows rollback
|
||||
if (_relative_stamp == target_stamp) {
|
||||
return;
|
||||
}
|
||||
TraceL << "Relative stamp changed: " << _relative_stamp << " -> " << target_stamp;
|
||||
_relative_stamp = target_stamp;
|
||||
} else {
|
||||
// 不允许回退, 则让另外一个Track的时间戳增长 [AUTO-TRANSLATED:428e8ce2]
|
||||
// Not allowed to rollback, then let the timestamp of the other Track increase
|
||||
target_stamp = _relative_stamp - dts_diff;
|
||||
if (_sync_master->_relative_stamp == target_stamp) {
|
||||
return;
|
||||
}
|
||||
TraceL << "Relative stamp changed: " << _sync_master->_relative_stamp << " -> " << target_stamp;
|
||||
_sync_master->_relative_stamp = target_stamp;
|
||||
}
|
||||
}
|
||||
_need_sync = false;
|
||||
_sync_master->_need_sync = false;
|
||||
if (_need_sync) {
|
||||
--_need_sync;
|
||||
}
|
||||
if (_sync_master->_need_sync) {
|
||||
--_sync_master->_need_sync;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -117,7 +117,7 @@ public:
|
||||
|
||||
* [AUTO-TRANSLATED:7ac41a76]
|
||||
*/
|
||||
void syncTo(Stamp &other);
|
||||
void syncTo(Stamp &other, int count = 1);
|
||||
|
||||
/**
|
||||
* 是否允许时间戳回退
|
||||
@ -145,7 +145,7 @@ private:
|
||||
|
||||
private:
|
||||
bool _playback = false;
|
||||
bool _need_sync = false;
|
||||
int _need_sync = 0;
|
||||
// 默认不允许时间戳回滚 [AUTO-TRANSLATED:0163ff03]
|
||||
// Default does not allow timestamp rollback
|
||||
bool _enable_rollback = false;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user