Browse Source

tidy up rtmp

pull/340/head
aler9 5 years ago
parent
commit
3bf0777ee0
  1. 4
      internal/clientrtmp/client.go
  2. 56
      internal/rtmputils/metadata.go
  3. 2
      internal/sourcertmp/source.go

4
internal/clientrtmp/client.go

@ -251,7 +251,7 @@ func (c *Client) runRead() {
} }
c.conn.NetConn().SetWriteDeadline(time.Now().Add(c.writeTimeout)) c.conn.NetConn().SetWriteDeadline(time.Now().Add(c.writeTimeout))
rtmputils.WriteMetadata(c.conn, videoTrack, audioTrack) c.conn.WriteMetadata(videoTrack, audioTrack)
if videoTrack != nil { if videoTrack != nil {
codec := h264.Codec{ codec := h264.Codec{
@ -435,7 +435,7 @@ func (c *Client) runPublish() {
defer close(setupDone) defer close(setupDone)
err = func() error { err = func() error {
c.conn.NetConn().SetReadDeadline(time.Now().Add(c.readTimeout)) c.conn.NetConn().SetReadDeadline(time.Now().Add(c.readTimeout))
videoTrack, audioTrack, err = rtmputils.ReadMetadata(c.conn) videoTrack, audioTrack, err = c.conn.ReadMetadata()
if err != nil { if err != nil {
return err return err
} }

56
internal/rtmputils/metadata.go

@ -14,39 +14,37 @@ const (
codecAAC = 10 codecAAC = 10
) )
func readMetadata(conn *Conn) (flvio.AMFMap, error) { // ReadMetadata extracts track informations from a connection that is publishing.
pkt, err := conn.ReadPacket() func (conn *Conn) ReadMetadata() (*gortsplib.Track, *gortsplib.Track, error) {
if err != nil { var videoTrack *gortsplib.Track
return nil, err var audioTrack *gortsplib.Track
}
if pkt.Type != av.Metadata {
return nil, fmt.Errorf("first packet must be metadata")
}
arr, err := flvio.ParseAMFVals(pkt.Data, false) md, err := func() (flvio.AMFMap, error) {
if err != nil { pkt, err := conn.ReadPacket()
return nil, err if err != nil {
} return nil, err
}
if len(arr) != 1 { if pkt.Type != av.Metadata {
return nil, fmt.Errorf("invalid metadata") return nil, fmt.Errorf("first packet must be metadata")
} }
ma, ok := arr[0].(flvio.AMFMap) arr, err := flvio.ParseAMFVals(pkt.Data, false)
if !ok { if err != nil {
return nil, fmt.Errorf("invalid metadata") return nil, err
} }
return ma, nil if len(arr) != 1 {
} return nil, fmt.Errorf("invalid metadata")
}
// ReadMetadata extracts track informations from a RTMP connection that is publishing. ma, ok := arr[0].(flvio.AMFMap)
func ReadMetadata(conn *Conn) (*gortsplib.Track, *gortsplib.Track, error) { if !ok {
var videoTrack *gortsplib.Track return nil, fmt.Errorf("invalid metadata")
var audioTrack *gortsplib.Track }
md, err := readMetadata(conn) return ma, nil
}()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -158,8 +156,8 @@ func ReadMetadata(conn *Conn) (*gortsplib.Track, *gortsplib.Track, error) {
} }
} }
// WriteMetadata writes track informations to a RTMP connection that is reading. // WriteMetadata writes track informations to a connection that is reading.
func WriteMetadata(conn *Conn, videoTrack *gortsplib.Track, audioTrack *gortsplib.Track) error { func (conn *Conn) WriteMetadata(videoTrack *gortsplib.Track, audioTrack *gortsplib.Track) error {
return conn.WritePacket(av.Packet{ return conn.WritePacket(av.Packet{
Type: av.Metadata, Type: av.Metadata,
Data: flvio.FillAMF0ValMalloc(flvio.AMFMap{ Data: flvio.FillAMF0ValMalloc(flvio.AMFMap{

2
internal/sourcertmp/source.go

@ -138,7 +138,7 @@ func (s *Source) runInner() bool {
go func() { go func() {
defer close(metadataDone) defer close(metadataDone)
conn.NetConn().SetReadDeadline(time.Now().Add(s.readTimeout)) conn.NetConn().SetReadDeadline(time.Now().Add(s.readTimeout))
videoTrack, audioTrack, err = rtmputils.ReadMetadata(conn) videoTrack, audioTrack, err = conn.ReadMetadata()
}() }()
select { select {

Loading…
Cancel
Save