]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Add 配置 fmp4跳过解码出错的帧
authorqydysky <qydysky@foxmail.com>
Sat, 25 May 2024 13:23:03 +0000 (13:23 +0000)
committerqydysky <qydysky@foxmail.com>
Sat, 25 May 2024 13:23:03 +0000 (13:23 +0000)
Reply/stream.go
demo/config/config_K_v.json

index b682db9492b0a4d4436747b44cb92ec3eab4d12a..9516d14ad579b3e1194df49db51483b5b63dcf55 100644 (file)
@@ -888,6 +888,7 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                fmp4ListUpdateTo = 5.0
                fmp4Count        = 0
                startT           = time.Now()
+               skipErrFrame     = false
        )
 
        if v, ok := t.common.K_v.LoadV(`fmp4音视频时间戳容差s`).(float64); ok && v > 0.1 {
@@ -899,6 +900,9 @@ func (t *M4SStream) saveStreamM4s() (e error) {
        if v, ok := t.common.K_v.LoadV(`fmp4列表更新超时s`).(float64); ok && fmp4ListUpdateTo < v {
                fmp4ListUpdateTo = v
        }
+       if v, ok := t.common.K_v.LoadV(`fmp4跳过解码出错的帧`).(bool); ok {
+               skipErrFrame = v
+       }
 
        // 下载循环
        for download_seq := []*m4s_link_item{}; ; {
@@ -1018,14 +1022,16 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                // 传递已下载切片
                for k := 0; k < len(download_seq) && download_seq[k].status == 2; k++ {
 
-                       if download_seq[k].isInit() {
+                       cu := download_seq[k]
+
+                       if cu.isInit() {
                                {
-                                       buf, unlock := download_seq[k].data.GetPureBufRLock()
+                                       buf, unlock := cu.data.GetPureBufRLock()
                                        front_buf, e := fmp4Decoder.Init_fmp4(buf)
                                        unlock()
                                        if e != nil {
                                                t.log.L(`E: `, e, `重试!`)
-                                               download_seq[k].status = 3
+                                               cu.status = 3
                                                break
                                        } else {
                                                for _, trak := range fmp4Decoder.traks {
@@ -1037,21 +1043,21 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                                                t.msg.Push_tag(`load`, t)
                                        }
                                }
-                               t.putM4s(download_seq[k])
+                               t.putM4s(cu)
                                download_seq = append(download_seq[:k], download_seq[k+1:]...)
                                k -= 1
                                continue
                        } else if t.first_buf == nil {
-                               t.putM4s(download_seq[k])
+                               t.putM4s(cu)
                                download_seq = append(download_seq[:k], download_seq[k+1:]...)
                                k -= 1
                                continue
                        }
 
-                       if e := download_seq[k].data.AppendTo(buf); e != nil {
+                       if e := cu.data.AppendTo(buf); e != nil {
                                t.log.L(`E: `, e)
                        }
-                       t.putM4s(download_seq[k])
+                       t.putM4s(cu)
                        download_seq = append(download_seq[:k], download_seq[k+1:]...)
                        k -= 1
 
@@ -1064,10 +1070,17 @@ func (t *M4SStream) saveStreamM4s() (e error) {
                                //丢弃所有数据
                                buf.Reset()
                                e = err
-                               return
+                               if skipErrFrame {
+                                       // 将此切片服务器设置停用
+                                       if u, e := url.Parse(cu.Url); e == nil {
+                                               t.common.DisableLiveAuto(u.Host)
+                                       }
+                               } else {
+                                       return
+                               }
                        }
 
-                       // no, _ := download_seq[k].getNo()
+                       // no, _ := cu.getNo()
                        // fmt.Println(no, "fmp4KeyFrames", keyframe.Size(), last_available_offset, err)
 
                        // 传递关键帧
index 50e39d1fadf828e6da58a6c456036b9e9a08b147..1f9652c329e11e37cd2597f439e004c40f57135e 100644 (file)
@@ -75,6 +75,8 @@
     "flv断流续接": true,
     "fmp4切片下载超时s": 3,
     "fmp4获取更多服务器": true,
+    "fmp4跳过解码出错的帧-help": "fmp4跳过解码出错的帧、但可能导致关键帧时间上的跳越",
+    "fmp4跳过解码出错的帧": false,
     "fmp4列表更新超时s": 7,
     "fmp4音视频时间戳容差s-help": "默认0.1,小于默认无效,调大可以允许较差的流,但可能会音画不同步",
     "fmp4音视频时间戳容差s": 0.2,