diff --git a/internal/rtmp/conn.go b/internal/rtmp/conn.go index af2d3d12..673b66bb 100644 --- a/internal/rtmp/conn.go +++ b/internal/rtmp/conn.go @@ -584,7 +584,7 @@ func (c *Conn) WriteMessage(msg message.Message) error { return c.mrw.Write(msg) } -func trackFromH264DecoderConfig(data []byte) (*format.H264, error) { +func trackFromH264DecoderConfig(data []byte) (format.Format, error) { var conf h264conf.Conf err := conf.Unmarshal(data) if err != nil { @@ -766,9 +766,9 @@ func (c *Conn) readTracksFromMetadata(payload []interface{}) (format.Format, *fo } } -func (c *Conn) readTracksFromMessages(msg message.Message) (*format.H264, *format.MPEG4Audio, error) { +func (c *Conn) readTracksFromMessages(msg message.Message) (format.Format, *format.MPEG4Audio, error) { var startTime *time.Duration - var videoTrack *format.H264 + var videoTrack format.Format var audioTrack *format.MPEG4Audio // analyze 1 second of packets diff --git a/internal/rtmp/conn_test.go b/internal/rtmp/conn_test.go index 7c969ef7..80a72a0a 100644 --- a/internal/rtmp/conn_test.go +++ b/internal/rtmp/conn_test.go @@ -5,6 +5,7 @@ import ( "net" "net/url" "testing" + "time" "github.com/aler9/gortsplib/v2/pkg/codecs/h264" "github.com/aler9/gortsplib/v2/pkg/codecs/mpeg4audio" @@ -537,7 +538,7 @@ func TestReadTracks(t *testing.T) { }, }, { - "missing metadata", + "missing metadata, video+audio", &format.H264{ PayloadTyp: 96, SPS: sps, @@ -556,6 +557,21 @@ func TestReadTracks(t *testing.T) { IndexDeltaLength: 3, }, }, + { + "missing metadata, audio", + nil, + &format.MPEG4Audio{ + PayloadTyp: 96, + Config: &mpeg4audio.Config{ + Type: 2, + SampleRate: 44100, + ChannelCount: 2, + }, + SizeLength: 13, + IndexLength: 3, + IndexDeltaLength: 3, + }, + }, { "obs studio h265", &format.H265{ @@ -796,6 +812,7 @@ func TestReadTracks(t *testing.T) { SPS: sps, PPS: pps, }.Marshal() + err = mrw.Write(&message.MsgVideo{ ChunkStreamID: message.MsgVideoChunkStreamID, MessageStreamID: 0x1000000, @@ -811,6 +828,7 @@ func TestReadTracks(t *testing.T) { ChannelCount: 2, }.Marshal() require.NoError(t, err) + err = mrw.Write(&message.MsgAudio{ ChunkStreamID: message.MsgAudioChunkStreamID, MessageStreamID: 0x1000000, @@ -855,6 +873,7 @@ func TestReadTracks(t *testing.T) { SPS: sps, PPS: pps, }.Marshal() + err = mrw.Write(&message.MsgVideo{ ChunkStreamID: message.MsgVideoChunkStreamID, MessageStreamID: 0x1000000, @@ -893,6 +912,7 @@ func TestReadTracks(t *testing.T) { SPS: sps, PPS: pps, }.Marshal() + err = mrw.Write(&message.MsgVideo{ ChunkStreamID: message.MsgVideoChunkStreamID, MessageStreamID: 0x1000000, @@ -908,6 +928,7 @@ func TestReadTracks(t *testing.T) { ChannelCount: 2, }.Marshal() require.NoError(t, err) + err = mrw.Write(&message.MsgAudio{ ChunkStreamID: message.MsgAudioChunkStreamID, MessageStreamID: 0x1000000, @@ -919,11 +940,12 @@ func TestReadTracks(t *testing.T) { }) require.NoError(t, err) - case "missing metadata": + case "missing metadata, video+audio": buf, _ := h264conf.Conf{ SPS: sps, PPS: pps, }.Marshal() + err = mrw.Write(&message.MsgVideo{ ChunkStreamID: message.MsgVideoChunkStreamID, MessageStreamID: 0x1000000, @@ -939,6 +961,7 @@ func TestReadTracks(t *testing.T) { ChannelCount: 2, }.Marshal() require.NoError(t, err) + err = mrw.Write(&message.MsgAudio{ ChunkStreamID: message.MsgAudioChunkStreamID, MessageStreamID: 0x1000000, @@ -950,6 +973,37 @@ func TestReadTracks(t *testing.T) { }) require.NoError(t, err) + case "missing metadata, audio": + enc, err := mpeg4audio.Config{ + Type: 2, + SampleRate: 44100, + ChannelCount: 2, + }.Marshal() + require.NoError(t, err) + + err = mrw.Write(&message.MsgAudio{ + ChunkStreamID: message.MsgAudioChunkStreamID, + MessageStreamID: 0x1000000, + Rate: flvio.SOUND_44Khz, + Depth: flvio.SOUND_16BIT, + Channels: flvio.SOUND_STEREO, + AACType: flvio.AAC_SEQHDR, + Payload: enc, + }) + require.NoError(t, err) + + err = mrw.Write(&message.MsgAudio{ + ChunkStreamID: message.MsgAudioChunkStreamID, + MessageStreamID: 0x1000000, + Rate: flvio.SOUND_44Khz, + Depth: flvio.SOUND_16BIT, + Channels: flvio.SOUND_STEREO, + AACType: flvio.AAC_SEQHDR, + Payload: enc, + DTS: 1 * time.Second, + }) + require.NoError(t, err) + case "obs studio h265": err = mrw.Write(&message.MsgDataAMF0{ ChunkStreamID: 4, @@ -1017,6 +1071,7 @@ func TestReadTracks(t *testing.T) { ChannelCount: 2, }.Marshal() require.NoError(t, err) + err = mrw.Write(&message.MsgAudio{ ChunkStreamID: message.MsgAudioChunkStreamID, MessageStreamID: 0x1000000,