78 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package mse
 | |
| 
 | |
| import (
 | |
| 	"git.r-2.top/kunmeng/vdk/av"
 | |
| 	"git.r-2.top/kunmeng/vdk/format/mp4f"
 | |
| 	"github.com/gobwas/ws"
 | |
| 	"github.com/gobwas/ws/wsutil"
 | |
| 	"net"
 | |
| 	"net/http"
 | |
| )
 | |
| 
 | |
| var Debug bool
 | |
| 
 | |
| type Muxer struct {
 | |
| 	m    *mp4f.Muxer
 | |
| 	r    *http.Request
 | |
| 	w    http.ResponseWriter
 | |
| 	conn net.Conn
 | |
| }
 | |
| 
 | |
| func NewMuxer(r *http.Request, w http.ResponseWriter) (*Muxer, error) {
 | |
| 	conn, _, _, err := ws.UpgradeHTTP(r, w)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	go func() {
 | |
| 		defer func() {
 | |
| 			conn.Close()
 | |
| 		}()
 | |
| 		for {
 | |
| 			if _, _, err = wsutil.NextReader(conn, ws.StateServerSide); err != nil {
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}()
 | |
| 
 | |
| 	return &Muxer{
 | |
| 		conn: conn,
 | |
| 		m:    mp4f.NewMuxer(nil),
 | |
| 		r:    r,
 | |
| 		w:    w,
 | |
| 	}, nil
 | |
| }
 | |
| 
 | |
| func (m *Muxer) WriteHeader(streams []av.CodecData) (err error) {
 | |
| 	if err = m.m.WriteHeader(streams); err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 	meta, fist := m.m.GetInit(streams)
 | |
| 	if err = wsutil.WriteServerText(m.conn, []byte(meta)); err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 	if err = wsutil.WriteServerBinary(m.conn, fist); err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func (m *Muxer) WritePacket(pkt av.Packet) (err error) {
 | |
| 	gotFrame, buffer, err := m.m.WritePacket(pkt, false)
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 	if gotFrame {
 | |
| 		if err = wsutil.WriteServerBinary(m.conn, buffer); err != nil {
 | |
| 			return
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func (m *Muxer) WriteTrailer() (err error) {
 | |
| 
 | |
| 	return m.conn.Close()
 | |
| }
 | 
