(1) [opt] 转ts时,如果调整时间戳失败则使用调整前的时间戳 (2) [log] 丰富转hls异常时的日志

pull/241/head
q191201771 2 years ago
parent cadb1926fc
commit 14d175206f

@ -152,7 +152,7 @@ func (m *Muxer) FeedMpegts(tsPackets []byte, frame *mpegts.Frame, boundary bool)
//Log.Debugf("> FeedMpegts. boundary=%v, frame=%p, sid=%d", boundary, frame, frame.Sid)
if frame.Sid == mpegts.StreamIdAudio {
// TODO(chef): 为什么音频用pts视频用dts
if err := m.updateFragment(frame.Pts, boundary); err != nil {
if err := m.updateFragment(frame.Pts, boundary, frame); err != nil {
Log.Errorf("[%s] update fragment error. err=%+v", m.UniqueKey, err)
return
}
@ -162,7 +162,7 @@ func (m *Muxer) FeedMpegts(tsPackets []byte, frame *mpegts.Frame, boundary bool)
}
//Log.Debugf("[%s] WriteFrame A. dts=%d, len=%d", m.UniqueKey, frame.DTS, len(frame.Raw))
} else {
if err := m.updateFragment(frame.Dts, boundary); err != nil {
if err := m.updateFragment(frame.Dts, boundary, frame); err != nil {
Log.Errorf("[%s] update fragment error. err=%+v", m.UniqueKey, err)
return
}
@ -192,8 +192,10 @@ func (m *Muxer) OutPath() string {
//
// @param boundary: 调用方认为可能是开启新TS切片的时间点
//
// @param frame: 内部只在打日志时使用
//
// @return: 理论上,只有文件操作失败才会返回错误
func (m *Muxer) updateFragment(ts uint64, boundary bool) error {
func (m *Muxer) updateFragment(ts uint64, boundary bool, frame *mpegts.Frame) error {
discont := true
// 如果已经有TS切片检查是否需要强制开启新的切片以及切片是否发生跳跃
@ -210,7 +212,7 @@ func (m *Muxer) updateFragment(ts uint64, boundary bool) error {
//
maxfraglen := uint64(m.config.FragmentDurationMs * 90 * 10)
if (ts > m.fragTs && ts-m.fragTs > maxfraglen) || (m.fragTs > ts && m.fragTs-ts > negMaxfraglen) {
Log.Warnf("[%s] force fragment split. fragTs=%d, ts=%d", m.UniqueKey, m.fragTs, ts)
Log.Warnf("[%s] force fragment split. fragTs=%d, ts=%d, frame=%s", m.UniqueKey, m.fragTs, ts, frame.DebugString())
if err := m.closeFragment(false); err != nil {
return err

@ -480,8 +480,8 @@ func (s *Rtmp2MpegtsRemuxer) adjustDtsPts(frame *mpegts.Frame) {
if s.basicAudioPts == math.MaxUint64 {
s.basicAudioPts = frame.Pts
}
frame.Dts = subSafe(frame.Dts, s.basicAudioDts)
frame.Pts = subSafe(frame.Pts, s.basicAudioPts)
frame.Dts = subSafe(frame.Dts, s.basicAudioDts, s.UniqueKey, frame)
frame.Pts = subSafe(frame.Pts, s.basicAudioPts, s.UniqueKey, frame)
} else if frame.Sid == mpegts.StreamIdVideo {
if s.basicVideoDts == math.MaxUint64 {
s.basicVideoDts = frame.Dts
@ -489,15 +489,15 @@ func (s *Rtmp2MpegtsRemuxer) adjustDtsPts(frame *mpegts.Frame) {
if s.basicVideoPts == math.MaxUint64 {
s.basicVideoPts = frame.Pts
}
frame.Dts = subSafe(frame.Dts, s.basicVideoDts)
frame.Pts = subSafe(frame.Pts, s.basicVideoPts)
frame.Dts = subSafe(frame.Dts, s.basicVideoDts, s.UniqueKey, frame)
frame.Pts = subSafe(frame.Pts, s.basicVideoPts, s.UniqueKey, frame)
}
}
func subSafe(a, b uint64) uint64 {
func subSafe(a, b uint64, uk string, frame *mpegts.Frame) uint64 {
if a >= b {
return a - b
}
Log.Warnf("subSafe. a=%d, b=%d", a, b)
return 0
Log.Warnf("[%s] subSafe. a=%d, b=%d, frame=%s", uk, a, b, frame.DebugString())
return a
}

Loading…
Cancel
Save