Skip to content

Commit a31d9ec

Browse files
committed
feat(avpipeline): 优化直播下 pts 跳过一段时间的 master 时间设置
1 parent 1d374d5 commit a31d9ec

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

src/avpipeline/AudioRenderPipeline.ts

+17-7
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export interface AudioRenderTaskOptions extends TaskOptions {
6666
avframeList: pointer<List<pointer<AVFrameRef>>>
6767
avframeListMutex: pointer<Mutex>
6868
enableJitterBuffer: boolean
69+
isLive: boolean
6970
}
7071

7172
type SelfTask = AudioRenderTaskOptions & {
@@ -245,11 +246,15 @@ export default class AudioRenderPipeline extends Pipeline {
245246
logger.debug(`got first audio frame, pts: ${audioFrame.pts}(${start}ms), taskId: ${task.taskId}`)
246247
}
247248

248-
task.currentPTS = avRescaleQ(audioFrame.pts, task.timeBase, AV_MILLI_TIME_BASE_Q)
249-
if (task.currentPTS > 0n && task.masterTimer.getMasterTime() - task.currentPTS > MASTER_SYNC_THRESHOLD) {
250-
task.masterTimer.setMasterTime(task.currentPTS)
249+
const pts = avRescaleQ(audioFrame.pts, task.timeBase, AV_MILLI_TIME_BASE_Q)
250+
if (pts > 0n && (task.masterTimer.getMasterTime() - pts > MASTER_SYNC_THRESHOLD)) {
251+
task.masterTimer.setMasterTime(pts)
251252
}
252-
253+
// 直播差值大于 4s 认为从某一处开始了
254+
else if (task.isLive && (pts - task.currentPTS > 4000n)) {
255+
task.masterTimer.setMasterTime(pts)
256+
}
257+
task.currentPTS = pts
253258
task.stats.audioFrameRenderCount++
254259

255260
if (task.lastRenderTimestamp) {
@@ -891,10 +896,15 @@ export default class AudioRenderPipeline extends Pipeline {
891896

892897
next /= (task.playRate * task.playTempo)
893898

894-
task.currentPTS = avRescaleQ(audioFrame.pts, task.timeBase, AV_MILLI_TIME_BASE_Q)
895-
if (task.currentPTS > 0n && (task.masterTimer.getMasterTime() - task.currentPTS > MASTER_SYNC_THRESHOLD)) {
896-
task.masterTimer.setMasterTime(task.currentPTS)
899+
const pts = avRescaleQ(audioFrame.pts, task.timeBase, AV_MILLI_TIME_BASE_Q)
900+
if (pts > 0n && (task.masterTimer.getMasterTime() - pts > MASTER_SYNC_THRESHOLD)) {
901+
task.masterTimer.setMasterTime(pts)
902+
}
903+
// 直播差值大于 4s 认为从某一处开始了
904+
else if (task.isLive && (pts - task.currentPTS > 4000n)) {
905+
task.masterTimer.setMasterTime(pts)
897906
}
907+
task.currentPTS = pts
898908

899909
const diffPts = task.currentPTS - task.masterTimer.getMasterTime()
900910
if (diffPts > MASTER_SYNC_THRESHOLD) {

src/avpipeline/VideoRenderPipeline.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -535,8 +535,8 @@ export default class VideoRenderPipeline extends Pipeline {
535535
return
536536
}
537537
}
538-
// 直播差值大于 5s 认为从某一处开始了
539-
else if ((pts - task.currentPTS > 5000n) && task.isLive) {
538+
// 直播差值大于 4s 认为从某一处开始了
539+
else if ((pts - task.currentPTS > 4000n) && task.isLive) {
540540
task.masterTimer.setMasterTime(pts)
541541
}
542542

src/avplayer/AVPlayer.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,7 @@ export default class AVPlayer extends Emitter implements ControllerObserver {
18221822
)
18231823
.invoke({
18241824
taskId: this.taskId,
1825+
isLive: this.options.isLive,
18251826
leftPort: this.audioDecoder2AudioRenderChannel.port2,
18261827
rightPort: this.audioRender2AudioWorkletChannel.port1,
18271828
controlPort: this.controller.getAudioRenderControlPort(),

0 commit comments

Comments
 (0)