Skip to content

Commit

Permalink
Save-to-webm: use timestamp from samplebuilder
Browse files Browse the repository at this point in the history
This avoids desyncing by accumulating drift.
  • Loading branch information
tmatth committed Sep 30, 2022
1 parent 62ca572 commit 4f95b29
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions save-to-webm/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ func main() {
}

type webmSaver struct {
audioWriter, videoWriter webm.BlockWriteCloser
audioBuilder, videoBuilder *samplebuilder.SampleBuilder
audioTimestamp, videoTimestamp time.Duration
audioWriter, videoWriter webm.BlockWriteCloser
audioBuilder, videoBuilder *samplebuilder.SampleBuilder
hasStartAudioOffset, hasStartVideoOffset bool
startAudioOffset, startVideoOffset uint32
}

func newWebmSaver() *webmSaver {
Expand All @@ -61,13 +62,16 @@ func (s *webmSaver) PushOpus(rtpPacket *rtp.Packet) {
s.audioBuilder.Push(rtpPacket)

for {
sample := s.audioBuilder.Pop()
sample, audioTimestamp := s.audioBuilder.PopWithTimestamp()
if sample == nil {
return
}
if s.audioWriter != nil {
s.audioTimestamp += sample.Duration
if _, err := s.audioWriter.Write(true, int64(s.audioTimestamp/time.Millisecond), sample.Data); err != nil {
if !s.hasStartAudioOffset {
s.startAudioOffset = audioTimestamp
s.hasStartAudioOffset = true
}
if _, err := s.audioWriter.Write(true, int64((audioTimestamp-s.startAudioOffset)/48), sample.Data); err != nil {
panic(err)
}
}
Expand All @@ -77,7 +81,7 @@ func (s *webmSaver) PushVP8(rtpPacket *rtp.Packet) {
s.videoBuilder.Push(rtpPacket)

for {
sample := s.videoBuilder.Pop()
sample, videoTimestamp := s.videoBuilder.PopWithTimestamp()
if sample == nil {
return
}
Expand All @@ -95,8 +99,11 @@ func (s *webmSaver) PushVP8(rtpPacket *rtp.Packet) {
}
}
if s.videoWriter != nil {
s.videoTimestamp += sample.Duration
if _, err := s.videoWriter.Write(videoKeyframe, int64(s.videoTimestamp/time.Millisecond), sample.Data); err != nil {
if !s.hasStartVideoOffset {
s.startVideoOffset = videoTimestamp
s.hasStartVideoOffset = true
}
if _, err := s.videoWriter.Write(videoKeyframe, int64((videoTimestamp-s.startVideoOffset)/90), sample.Data); err != nil {
panic(err)
}
}
Expand Down

0 comments on commit 4f95b29

Please sign in to comment.