diff --git a/internal/clientrtmp/client.go b/internal/clientrtmp/client.go index 219920f6..f0e5d9b8 100644 --- a/internal/clientrtmp/client.go +++ b/internal/clientrtmp/client.go @@ -251,7 +251,7 @@ func (c *Client) runRead() { } c.conn.NetConn().SetWriteDeadline(time.Now().Add(c.writeTimeout)) - rtmputils.WriteMetadata(c.conn, videoTrack, audioTrack) + c.conn.WriteMetadata(videoTrack, audioTrack) if videoTrack != nil { codec := h264.Codec{ @@ -435,7 +435,7 @@ func (c *Client) runPublish() { defer close(setupDone) err = func() error { 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 { return err } diff --git a/internal/rtmputils/metadata.go b/internal/rtmputils/metadata.go index ec1473eb..f4229611 100644 --- a/internal/rtmputils/metadata.go +++ b/internal/rtmputils/metadata.go @@ -14,39 +14,37 @@ const ( codecAAC = 10 ) -func readMetadata(conn *Conn) (flvio.AMFMap, error) { - pkt, err := conn.ReadPacket() - if err != nil { - return nil, err - } - - if pkt.Type != av.Metadata { - return nil, fmt.Errorf("first packet must be metadata") - } - - arr, err := flvio.ParseAMFVals(pkt.Data, false) - if err != nil { - return nil, err - } - - if len(arr) != 1 { - return nil, fmt.Errorf("invalid metadata") - } - - ma, ok := arr[0].(flvio.AMFMap) - if !ok { - return nil, fmt.Errorf("invalid metadata") - } - - return ma, nil -} - -// ReadMetadata extracts track informations from a RTMP connection that is publishing. -func ReadMetadata(conn *Conn) (*gortsplib.Track, *gortsplib.Track, error) { +// ReadMetadata extracts track informations from a connection that is publishing. +func (conn *Conn) ReadMetadata() (*gortsplib.Track, *gortsplib.Track, error) { var videoTrack *gortsplib.Track var audioTrack *gortsplib.Track - md, err := readMetadata(conn) + md, err := func() (flvio.AMFMap, error) { + pkt, err := conn.ReadPacket() + if err != nil { + return nil, err + } + + if pkt.Type != av.Metadata { + return nil, fmt.Errorf("first packet must be metadata") + } + + arr, err := flvio.ParseAMFVals(pkt.Data, false) + if err != nil { + return nil, err + } + + if len(arr) != 1 { + return nil, fmt.Errorf("invalid metadata") + } + + ma, ok := arr[0].(flvio.AMFMap) + if !ok { + return nil, fmt.Errorf("invalid metadata") + } + + return ma, nil + }() if err != nil { 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. -func WriteMetadata(conn *Conn, videoTrack *gortsplib.Track, audioTrack *gortsplib.Track) error { +// WriteMetadata writes track informations to a connection that is reading. +func (conn *Conn) WriteMetadata(videoTrack *gortsplib.Track, audioTrack *gortsplib.Track) error { return conn.WritePacket(av.Packet{ Type: av.Metadata, Data: flvio.FillAMF0ValMalloc(flvio.AMFMap{ diff --git a/internal/sourcertmp/source.go b/internal/sourcertmp/source.go index a1f83715..5c058b86 100644 --- a/internal/sourcertmp/source.go +++ b/internal/sourcertmp/source.go @@ -138,7 +138,7 @@ func (s *Source) runInner() bool { go func() { defer close(metadataDone) conn.NetConn().SetReadDeadline(time.Now().Add(s.readTimeout)) - videoTrack, audioTrack, err = rtmputils.ReadMetadata(conn) + videoTrack, audioTrack, err = conn.ReadMetadata() }() select {