"os"
"runtime"
"strings"
+ "sync"
"testing"
"time"
gcAvgS = time.Since(t.StartT).Seconds() / float64(memStats.NumGC)
}
+ streams := make(map[int]any)
+
+ StreamO.Range(func(key, value any) bool {
+ streams[key.(int)] = value
+ return true
+ })
+
reqState := t.ReqPool.State()
ResStruct{0, "ok", map[string]any{
"gcCPUFractionPpm": float64(int(memStats.GCCPUFraction*100000000)) / 100,
"gcAvgS": float64(int(gcAvgS*100)) / 100,
},
- "common": t,
+ "common": streams,
},
},
}.Write(w)
var C = new(Common).Init()
+// StreamRec
+// fmp4
+// https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming
+var StreamO = new(sync.Map)
+
// 消息队列
type Danmu_Main_mq_item struct {
Class string
return fmt.Sprintf("%d:%02d:%02d.%02d", int(math.Floor(t.Hours())), M, S, Ns)
}
-// fmp4
-// https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming
-var streamO = new(sync.Map)
-
// 获取实例的Common
func StreamOCommon(roomid int) (array []*c.Common) {
if roomid != -1 { //返回特定房间
- if v, ok := streamO.Load(roomid); ok {
+ if v, ok := c.StreamO.Load(roomid); ok {
return []*c.Common{v.(*M4SStream).Common()}
}
} else { //返回所有
- streamO.Range(func(_, v interface{}) bool {
+ c.StreamO.Range(func(_, v interface{}) bool {
array = append(array, v.(*M4SStream).Common())
return true
})
// 获取实例的录制状态
func StreamOStatus(roomid int) (Islive bool) {
- v, ok := streamO.Load(roomid)
+ v, ok := c.StreamO.Load(roomid)
return ok && (!pctx.Done(v.(*M4SStream).Status) || v.(*M4SStream).exitSign.Islive())
}
//实例回调,避免重复录制
tmp.Callback_start = func(ms *M4SStream) error {
//流服务添加
- if _, ok := streamO.LoadOrStore(ms.common.Roomid, tmp); ok {
+ if _, ok := c.StreamO.LoadOrStore(ms.common.Roomid, tmp); ok {
return fmt.Errorf("已存在此直播间(%d)录制", ms.common.Roomid)
}
return nil
}
tmp.Callback_stop = func(ms *M4SStream) {
- streamO.Delete(ms.common.Roomid) //流服务去除
+ c.StreamO.Delete(ms.common.Roomid) //流服务去除
}
tmp.Start()
}
func StreamOStop(roomid int) {
switch roomid {
case -2: // 其他房间
- streamO.Range(func(_roomid, v interface{}) bool {
+ c.StreamO.Range(func(_roomid, v interface{}) bool {
if c.C.Roomid == _roomid {
return true
}
if !pctx.Done(v.(*M4SStream).Status) {
v.(*M4SStream).Stop()
}
- streamO.Delete(_roomid)
+ c.StreamO.Delete(_roomid)
return true
})
case -1: // 所有房间
- streamO.Range(func(k, v interface{}) bool {
+ c.StreamO.Range(func(k, v interface{}) bool {
if !pctx.Done(v.(*M4SStream).Status) {
v.(*M4SStream).Stop()
}
- streamO.Delete(k)
+ c.StreamO.Delete(k)
return true
})
default: // 针对某房间
- if v, ok := streamO.Load(roomid); ok {
+ if v, ok := c.StreamO.Load(roomid); ok {
if !pctx.Done(v.(*M4SStream).Status) {
v.(*M4SStream).Stop()
}
- streamO.Delete(roomid)
+ c.StreamO.Delete(roomid)
}
}
}
// 实例切断
func StreamOCut(roomid int) (setTitle func(string)) {
- if v, ok := streamO.Load(roomid); ok {
+ if v, ok := c.StreamO.Load(roomid); ok {
if !pctx.Done(v.(*M4SStream).Status) {
v.(*M4SStream).Cut()
flog.L(`I: `, `已切片 `+strconv.Itoa(roomid))
// 获取当前房间的
var currentStreamO *M4SStream
- streamO.Range(func(key, value interface{}) bool {
+ c.StreamO.Range(func(key, value interface{}) bool {
if key != nil && c.C.Roomid == key.(int) {
currentStreamO = value.(*M4SStream)
return false
// 获取当前房间的
var currentStreamO *M4SStream
- streamO.Range(func(key, value interface{}) bool {
+ c.StreamO.Range(func(key, value interface{}) bool {
if key != nil && c.C.Roomid == key.(int) {
currentStreamO = value.(*M4SStream)
return false