mirror of
https://github.com/Monibuca/plugin-jessica.git
synced 2025-09-27 12:22:14 +08:00
跟随引擎4.3.0版本
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user