|
|
|
@ -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{ |
|
|
|
|