}
// 签到
+// 签到活动已下线
func Dosign() {
apilog := apilog.Base_add(`签到`).L(`T: `, `签到`)
//验证cookie
if strings.HasSuffix(v, "mp4") {
w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s.%d.mp4\"", qref, time.Now().Unix()))
fmp4Decoder := NewFmp4Decoder()
+ if v, ok := c.C.K_v.LoadV(`debug模式`).(bool); ok && v {
+ fmp4Decoder.Debug = true
+ }
if v, ok := c.C.K_v.LoadV(`fmp4音视频时间戳容差s`).(float64); ok && v > 0.1 {
fmp4Decoder.AVTDiff = v
}
}
for c := 0; err == nil && !over; c++ {
- n, e := reader.Read(buf)
- if n == 0 && errors.Is(e, io.EOF) {
- return io.EOF
- }
- err = buff.Append(buf[:n])
if buff.Size() < bufSize {
+ n, e := reader.Read(buf)
+ if n == 0 && errors.Is(e, io.EOF) {
+ return io.EOF
+ }
+ err = buff.Append(buf[:n])
continue
}
buf *slice.Buf[byte]
AVTDiff float64 // 音视频时间戳容差
+ Debug bool
}
func NewFmp4Decoder() *Fmp4Decoder {
audio timeStamp
)
- // fmt.Println(moofSN, "frame1", keyframeMoof, t.buf.size(), m[0].i, m[10].n, m[10].e)
-
{
ts, handlerType := get_track_type(m[3].i, m[4].i)
if handlerType == 'v' {
if ifWrite(video.getT()) {
_, err = w[0].Write(t.buf.GetPureBuf())
}
+ t.buf.Reset()
return true, ErrNormal
}
t.buf.Reset()
}
cu := t - firstFT
over = cu > durationM+startTM
- if startTM <= cu && !over {
- return true
- }
- return false
+ return startTM <= cu && !over
}
+ if t.Debug {
+ fmt.Printf("cut startT: %v duration: %v\n", startT, duration)
+ }
for c := 0; err == nil && !over; c++ {
- n, e := reader.Read(buf)
- if n == 0 && errors.Is(e, io.EOF) {
- return io.EOF
- }
- err = buff.Append(buf[:n])
if buff.Size() < bufSize {
+ n, e := reader.Read(buf)
+ if n == 0 && errors.Is(e, io.EOF) {
+ return io.EOF
+ }
+ err = buff.Append(buf[:n])
continue
}
bufSize *= 2
continue
} else {
+ if t.Debug {
+ fmt.Printf("write frontBuf: frontBufSize: %d\n", len(frontBuf))
+ }
init = true
_, err = w.Write(frontBuf)
}
}
for {
- if n, e := pipe.Read(buf); e != nil {
- pctx.PutVal(cancelC, &errCtx, e)
- break
- } else if e = buff.Append(buf[:n]); e != nil {
- pctx.PutVal(cancelC, &errCtx, e)
- break
- } else if buff.Size() < bufSize {
+ if buff.Size() < bufSize {
+ if n, e := pipe.Read(buf); e != nil {
+ pctx.PutVal(cancelC, &errCtx, e)
+ break
+ } else if e = buff.Append(buf[:n]); e != nil {
+ pctx.PutVal(cancelC, &errCtx, e)
+ break
+ }
continue
}
func (t *M4SStream) saveStreamM4s() (e error) {
+ var (
+ // 同时下载数限制
+ downloadLimit = funcCtrl.NewBlockFuncN(3)
+ buf = slice.New[byte]()
+ fmp4Decoder = NewFmp4Decoder()
+ keyframe = slice.New[byte]()
+ lastM4s *m4s_link_item
+ to = 3
+ fmp4ListUpdateTo = 5.0
+ fmp4Count = 0
+ startT = time.Now()
+ skipErrFrame = false
+ )
+
if v, ok := t.common.K_v.LoadV(`debug模式`).(bool); ok && v {
+ fmp4Decoder.Debug = true
cancle := make(chan struct{})
defer close(cancle)
go func() {
}
}()
}
-
- var (
- // 同时下载数限制
- downloadLimit = funcCtrl.NewBlockFuncN(3)
- buf = slice.New[byte]()
- fmp4Decoder = NewFmp4Decoder()
- keyframe = slice.New[byte]()
- lastM4s *m4s_link_item
- to = 3
- 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 {
fmp4Decoder.AVTDiff = v
}
//兑换硬币
F.Get(c.C).Silver_2_coin()
//每日签到
- F.Dosign()
+ // F.Dosign()
// 附加功能 savetojson
reply.SaveToJson.Init()
// 附加功能 保持牌子点亮
`new day`: func(_ any) bool { //日期更换
go func() {
//每日签到
- F.Dosign()
+ // F.Dosign()
//每日兑换硬币
F.Get(c.C).Silver_2_coin()
//附加功能 每日发送弹幕
replyFunc.Danmuji.Danmuji_auto(mainCtx, c.C.K_v.LoadV(`自动弹幕机_内容`).([]any), c.C.K_v.LoadV(`自动弹幕机_发送间隔s`).(float64), reply.Msg_senddanmu)
}
{ //附加功能 进房间发送弹幕 直播流保存 每日签到
- go F.Dosign()
+ // go F.Dosign()
go reply.Entry_danmu(common)
if _, e := recStartEnd.RecStartCheck.Run(mainCtx, common); e == nil {
go reply.StreamOStart(common, common.Roomid)