1 Star 0 Fork 0

t6685367 / videostream

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
http.go 2.16 KB
一键复制 编辑 原始数据 按行查看 历史
t6685367 提交于 2022-07-25 09:38 . videostream
package videostream
import (
"log"
"time"
"github.com/deepch/vdk/av"
"github.com/deepch/vdk/format/mp4f"
"github.com/gin-gonic/gin"
"golang.org/x/net/websocket"
)
func HttpServer() {
router := gin.Default()
gin.SetMode(gin.ReleaseMode)
router.GET("/ws/:suuid", func(c *gin.Context) {
handler := websocket.Handler(WS)
handler.ServeHTTP(c.Writer, c.Request)
})
err := router.Run(Config.Server.HTTPPort)
if err != nil {
log.Fatalln(err)
}
}
func WS(ws *websocket.Conn) {
defer ws.Close()
suuid := ws.Request().FormValue("suuid")
log.Println("Request", suuid)
if !Config.ext(suuid) {
log.Println("Stream Not Found")
return
}
Config.RunIFNotRun(suuid)
ws.SetWriteDeadline(time.Now().Add(5 * time.Second))
cuuid, ch := Config.clAd(suuid)
defer Config.clDe(suuid, cuuid)
codecs := Config.coGe(suuid)
if codecs == nil {
log.Println("Codecs Error")
return
}
for i, codec := range codecs {
if codec.Type().IsAudio() && codec.Type() != av.AAC {
log.Println("Track", i, "Audio Codec Work Only AAC")
}
}
muxer := mp4f.NewMuxer(nil)
err := muxer.WriteHeader(codecs)
if err != nil {
log.Println("muxer.WriteHeader", err)
return
}
meta, init := muxer.GetInit(codecs)
err = websocket.Message.Send(ws, append([]byte{9}, meta...))
if err != nil {
log.Println("websocket.Message.Send", err)
return
}
err = websocket.Message.Send(ws, init)
if err != nil {
return
}
var start bool
go func() {
for {
var message string
err := websocket.Message.Receive(ws, &message)
if err != nil {
ws.Close()
return
}
}
}()
noVideo := time.NewTimer(10 * time.Second)
var timeLine = make(map[int8]time.Duration)
for {
select {
case <-noVideo.C:
log.Println("noVideo")
return
case pck := <-ch:
if pck.IsKeyFrame {
noVideo.Reset(10 * time.Second)
start = true
}
if !start {
continue
}
timeLine[pck.Idx] += pck.Duration
pck.Time = timeLine[pck.Idx]
ready, buf, _ := muxer.WritePacket(pck, false)
if ready {
err = ws.SetWriteDeadline(time.Now().Add(10 * time.Second))
if err != nil {
return
}
err := websocket.Message.Send(ws, buf)
if err != nil {
return
}
}
}
}
}
Go
1
https://gitee.com/t6685367/videostream.git
git@gitee.com:t6685367/videostream.git
t6685367
videostream
videostream
372ee6b8a63a

搜索帮助