From 1271e83a8ae4ee67fcec57e0068e5955f4b49fbe Mon Sep 17 00:00:00 2001 From: qydysky Date: Fri, 11 Jun 2021 02:12:31 +0800 Subject: [PATCH] =?utf8?q?hls=E4=B8=8B=E8=BD=BD=E5=8F=8A=E6=B5=81=E6=9C=8D?= =?utf8?q?=E5=8A=A1=E4=BC=98=E5=8C=96,slice=20bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Reply/F.go | 76 +++++++++++++++++++++++++++++++++++++---------------- demo/go.mod | 2 +- demo/go.sum | 2 ++ go.mod | 2 +- go.sum | 2 ++ 5 files changed, 60 insertions(+), 24 deletions(-) diff --git a/Reply/F.go b/Reply/F.go index 642fff1..ff14347 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -35,6 +35,7 @@ import ( b "github.com/qydysky/part/buf" s "github.com/qydysky/part/signal" limit "github.com/qydysky/part/limit" + util "github.com/qydysky/part/util" "github.com/christopher-dG/go-obs-websocket" ) @@ -956,23 +957,23 @@ func Savestreamf(){ return false } + //add block var ( + m4s_num int + has_DICONTINUITY bool res []byte - add = int(savestream.hls_stream.t.Unix() % 3) + threshold = savestream.m4s_hls ) - - //add block + if threshold < 3 {threshold=3} { - var m4s_num int - //m4s list m4s_list_b := []byte{} for k,v := range hls_gen.m4s_list { if v.status != s_fin { //#EXT-X-DISCONTINUITY-SEQUENCE //reset hls lists - if k == m4s_num && m4s_num < 3 { - m4s_list := append(hls_gen.m4s_list[:k], &m4s_link_item{ + if !has_DICONTINUITY && m4s_num < threshold { + m4s_list := append(util.SliceCopy(hls_gen.m4s_list[:k]).([]*m4s_link_item), &m4s_link_item{ Base:"DICONTINUITY", status:s_fin, isshow:true, @@ -986,11 +987,12 @@ func Savestreamf(){ v.isshow = true if v.Base == "DICONTINUITY" { + has_DICONTINUITY = true m4s_list_b = append(m4s_list_b, []byte("#EXT-X-DICONTINUITY\n")...) continue } - if m4s_num >= savestream.m4s_hls+add {break} + if m4s_num >= savestream.m4s_hls {break} m4s_num += 1 // if m4s_num == 1 {SEQUENCE = strings.ReplaceAll(v.Base, ".m4s", "")} @@ -1011,31 +1013,59 @@ func Savestreamf(){ res = append(res, []byte(fmt.Sprintf("#INFO-BUFFER:%d/%d\n",m4s_num,len(hls_gen.m4s_list)))...) //add m4s res = append(res, m4s_list_b...) - } else { - //no useable fmp4 - //no del fmp4 and no flash the list - return false + //去除最后一个换行 + res = res[:len(res)-1] } + } - //去除最后一个换行 - if len(res) > 0 {res = res[:len(res)-1]} - - //设置到全局变量,方便流服务器获取 - savestream.hls_stream.b = res + //try to jump the hole + var skip_del bool + if m4s_num < threshold { + var ( + index int//the first useable fmp4 index of section + DICONTINUITY_num int + catch bool//catch useable fmp4? + ) + for i:=0;i threshold { + //find a nice index, remove all bad fmp4s + skip := 0 + skip_del = true + for ;index>=0;index-=1 { + if hls_gen.m4s_list[index].status == s_fin {continue} + skip+=1 + hls_gen.m4s_list = append(hls_gen.m4s_list[:index],hls_gen.m4s_list[index+1:]...) + } + l.L(`I: `,"卡顿,跳过",skip,"个tag") + break + } + } + catch = true + } } //设置到全局变量,方便流服务器获取 + if len(res) != 0 {savestream.hls_stream.b = res} savestream.hls_stream.t,_ = now.(time.Time) //del - if add != 2 {return false} - for del_num:=3;del_num > 0;hls_gen.m4s_list = hls_gen.m4s_list[1:] { + for del_num:=1;!skip_del&&del_num > 0;hls_gen.m4s_list = hls_gen.m4s_list[1:] { + del_num -= 1 + if !hls_gen.m4s_list[0].isshow {continue} //#EXT-X-DICONTINUITY if hls_gen.m4s_list[0].Base == "DICONTINUITY" { DISCONTINUITY += 1 continue } - del_num -= 1 //#EXTINF if hls_gen.m4s_list[0].isshow {SEQUENCE += 1} } @@ -1088,7 +1118,7 @@ func Savestreamf(){ } for k,v :=range links { - l.L(`I: `,"正在下载最后片段:",k,"/",len(links)) + l.L(`I: `,"正在下载最后片段:",k+1,"/",len(links)) v.status = s_loading r := reqf.New() if e := r.Reqf(reqf.Rval{ @@ -1096,6 +1126,7 @@ func Savestreamf(){ SaveToPath:savestream.path+v.Base, ConnectTimeout:5000, ReadTimeout:1000, + Retry: 1, Proxy:c.Proxy, }); e != nil && !errors.Is(e, io.EOF) { l.L(`I: `,e) @@ -1255,13 +1286,14 @@ func Savestreamf(){ if e := r.Reqf(reqf.Rval{ Url: link.Url, SaveToPath: path + link.Base, + Retry: 1, ConnectTimeout: 3000, ReadTimeout: 1000, Timeout: 3000, Proxy: c.Proxy, }); e != nil{ if reqf.IsTimeout(e) || strings.Contains(e.Error(), "x509") { - l.L(`I: `, link.Base, `将重试!`) + l.L(`T: `, link.Base, `将重试!`) //避免影响后续猜测 link.Offset_line = 0 miss_download.Lock() diff --git a/demo/go.mod b/demo/go.mod index 00b3feb..77000cc 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -14,7 +14,7 @@ require ( github.com/miekg/dns v1.1.42 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/qydysky/bili_danmu v0.5.9 - github.com/qydysky/part v0.5.21 // indirect + github.com/qydysky/part v0.5.22 // indirect github.com/shirou/gopsutil v3.21.5+incompatible // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect diff --git a/demo/go.sum b/demo/go.sum index 4b77bbc..ccc707a 100644 --- a/demo/go.sum +++ b/demo/go.sum @@ -304,6 +304,8 @@ github.com/qydysky/part v0.5.20 h1:4GEKdn3XjyCRH3gIev+JkVX4QkZXLv/VG7LlnfXygyU= github.com/qydysky/part v0.5.20/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part v0.5.21 h1:YttjojBT2w7ys8pc5kfHis4a2+aMRMYJXb+sOi+RWmU= github.com/qydysky/part v0.5.21/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.5.22 h1:KPaREUPSHidO/W9Blp708BSi7oqOfOE467+Tid6x25U= +github.com/qydysky/part v0.5.22/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad h1:Jtzf509lQrkUMGTV0Sc6IDCAiR1VrBcHrIban7hpye4= github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg= github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8= diff --git a/go.mod b/go.mod index 2d235a6..35923c1 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/mdp/qrterminal/v3 v3.0.0 github.com/miekg/dns v1.1.42 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/qydysky/part v0.5.21 + github.com/qydysky/part v0.5.22 github.com/shirou/gopsutil v3.21.5+incompatible // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 diff --git a/go.sum b/go.sum index 66faa10..462ae78 100644 --- a/go.sum +++ b/go.sum @@ -78,6 +78,8 @@ github.com/qydysky/part v0.5.20 h1:4GEKdn3XjyCRH3gIev+JkVX4QkZXLv/VG7LlnfXygyU= github.com/qydysky/part v0.5.20/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part v0.5.21 h1:YttjojBT2w7ys8pc5kfHis4a2+aMRMYJXb+sOi+RWmU= github.com/qydysky/part v0.5.21/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.5.22 h1:KPaREUPSHidO/W9Blp708BSi7oqOfOE467+Tid6x25U= +github.com/qydysky/part v0.5.22/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8= github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg= github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -- 2.39.2