跟随引擎4.3.0版本

This commit is contained in:
dexter
2022-06-19 23:41:53 +08:00
parent ac66c57b29
commit bcd0a5960a

View File

@@ -19,7 +19,9 @@ type JessicaSubscriber struct {
head []byte head []byte
} }
func (j *JessicaSubscriber) WriteAVCC(avcc net.Buffers) { func (j *JessicaSubscriber) WriteAVCC(avcc net.Buffers, typ byte, ts uint32) {
j.head[0] = typ
binary.BigEndian.PutUint32(j.head[1:], ts)
err := ws.WriteHeader(j, ws.Header{ err := ws.WriteHeader(j, ws.Header{
Fin: true, Fin: true,
OpCode: ws.OpBinary, OpCode: ws.OpBinary,
@@ -33,30 +35,21 @@ func (j *JessicaSubscriber) WriteAVCC(avcc net.Buffers) {
if err != nil { if err != nil {
return return
} }
if _, err = j.Write(j.head); err != nil { var clone net.Buffers
return clone = append(append(clone, j.head), avcc...)
} _, err = clone.WriteTo(j)
_, err = avcc.WriteTo(j)
} }
func (j *JessicaSubscriber) OnEvent(event any) { func (j *JessicaSubscriber) OnEvent(event any) {
switch v := event.(type) { switch v := event.(type) {
case AudioDeConf: case AudioDeConf:
j.head[0] = 1 j.WriteAVCC(v.AVCC, 1, 0)
binary.BigEndian.PutUint32(j.head[1:], 0)
j.WriteAVCC(v.GetAVCC())
case VideoDeConf: case VideoDeConf:
j.head[0] = 2 j.WriteAVCC(v.AVCC, 2, 0)
binary.BigEndian.PutUint32(j.head[1:], 0)
j.WriteAVCC(v.GetAVCC())
case *AudioFrame: case *AudioFrame:
j.head[0] = 1 j.WriteAVCC(v.AVCC, 1, v.AbsTime-j.SkipTS)
binary.BigEndian.PutUint32(j.head[1:], v.AbsTime)
j.WriteAVCC(v.GetAVCC())
case *VideoFrame: case *VideoFrame:
j.head[0] = 2 j.WriteAVCC(v.AVCC, 2, v.AbsTime-j.SkipTS)
binary.BigEndian.PutUint32(j.head[1:], v.AbsTime)
j.WriteAVCC(v.GetAVCC())
default: default:
j.Subscriber.OnEvent(event) j.Subscriber.OnEvent(event)
} }
@@ -66,7 +59,7 @@ type JessicaFLV struct {
Subscriber Subscriber
} }
func (j *JessicaFLV) WriteFLVTag(tag net.Buffers) { func (j *JessicaFLV) WriteFLVTag(tag FLVFrame) {
if err := ws.WriteHeader(j, ws.Header{ if err := ws.WriteHeader(j, ws.Header{
Fin: true, Fin: true,
OpCode: ws.OpBinary, OpCode: ws.OpBinary,
@@ -93,8 +86,8 @@ func (j *JessicaFLV) OnEvent(event any) {
if _, err := j.Write(codec.FLVHeader); err != nil { if _, err := j.Write(codec.FLVHeader); err != nil {
j.Stop() j.Stop()
} }
case HaveFLV: case FLVFrame:
j.WriteFLVTag(v.GetFLV()) j.WriteFLVTag(v)
default: default:
j.Subscriber.OnEvent(event) j.Subscriber.OnEvent(event)
} }
@@ -127,6 +120,9 @@ func (j *JessicaConfig) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} else { } else {
specific = &JessicaSubscriber{baseStream, make([]byte, 5)} specific = &JessicaSubscriber{baseStream, make([]byte, 5)}
} }
if err = plugin.Subscribe(streamPath, specific); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
}
go func() { go func() {
b := []byte{0} b := []byte{0}
for _, err := conn.Read(b); err == nil; _, err = conn.Read(b) { for _, err := conn.Read(b); err == nil; _, err = conn.Read(b) {
@@ -134,8 +130,9 @@ func (j *JessicaConfig) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
specific.Stop() specific.Stop()
}() }()
if isFlv {
if err := plugin.SubscribeBlock(streamPath, specific); err != nil { specific.PlayFLV()
http.Error(w, err.Error(), http.StatusBadRequest) } else {
specific.PlayRaw()
} }
} }