type Fmp4Decoder struct {
traks map[int]*trak
buf *slice.Buf[byte]
+
+ AVTDiff float64 // 音视频时间戳容差
}
func (t *Fmp4Decoder) Init_fmp4(buf []byte) (b []byte, err error) {
}
//sync audio timeStamp
- if math.Abs(video.getT()-audio.getT()) > 0.1 {
- return false, fmt.Errorf("时间戳不匹配%v %v", video.timeStamp, audio.timeStamp)
+ if t.AVTDiff <= 0.1 {
+ t.AVTDiff = 0.1
+ }
+ if diff := math.Abs(video.getT() - audio.getT()); diff > t.AVTDiff {
+ return false, fmt.Errorf("时间戳不匹配 %v %v (或许应调整fmp4音视频时间戳容差s>%.2f)", video.timeStamp, audio.timeStamp, diff)
// copy(video.data, F.Itob64(int64(audio.getT()*float64(video.timescale))))
}
fmp4ListUpdateTo = 5.0
)
+ if v, ok := t.common.K_v.LoadV(`fmp4音视频时间戳容差s`).(float64); ok && v > 0.1 {
+ fmp4Decoder.AVTDiff = v
+ }
if v, ok := t.common.K_v.LoadV(`fmp4切片下载超时s`).(float64); ok && to < int(v) {
to = int(v)
}
"flv断流续接": true,
"fmp4切片下载超时s": 3,
"fmp4列表更新超时s": 7,
+ "fmp4音视频时间戳容差s-help": "默认0.1,小于默认无效,调大可以允许较差的流,但可能会音画不同步",
+ "fmp4音视频时间戳容差s": 0.2,
"分段时长min-help": "=0为不启动功能,>0为指定分钟数时分段",
"分段时长min": 0,
"直播流保存位置": "./live",