From b4c85d98ecd72f4e31672fae1e8da7d87a3fbbf0 Mon Sep 17 00:00:00 2001 From: q191201771 <191201771@qq.com> Date: Sat, 19 Mar 2022 19:24:59 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20rtsp:=20=E5=A2=9E=E5=BC=BA=E5=AE=B9?= =?UTF-8?q?=E9=94=99=E6=80=A7=EF=BC=8C=E4=BF=AE=E5=A4=8Drtmp=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=B5=81=E6=B2=A1=E6=9C=89seq=20header=E6=97=B6?= =?UTF-8?q?=EF=BC=8Crtmp=E8=BD=ACrtsp=E5=86=85=E5=B4=A9=E6=BA=83=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/remux/rtmp2rtsp.go | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/pkg/remux/rtmp2rtsp.go b/pkg/remux/rtmp2rtsp.go index 3607eca..a8310ca 100644 --- a/pkg/remux/rtmp2rtsp.go +++ b/pkg/remux/rtmp2rtsp.go @@ -159,20 +159,27 @@ func (r *Rtmp2RtspRemuxer) isAnalyzeEnough() bool { } func (r *Rtmp2RtspRemuxer) remux(msg base.RtmpMsg) { + var packer *rtprtcp.RtpPacker var rtppkts []rtprtcp.RtpPacket switch msg.Header.MsgTypeId { case base.RtmpTypeIdAudio: - rtppkts = r.getAudioPacker().Pack(base.AvPacket{ - Timestamp: msg.Header.TimestampAbs, - PayloadType: r.audioPt, - Payload: msg.Payload[2:], - }) + packer = r.getAudioPacker() + if packer != nil { + rtppkts = packer.Pack(base.AvPacket{ + Timestamp: msg.Header.TimestampAbs, + PayloadType: r.audioPt, + Payload: msg.Payload[2:], + }) + } case base.RtmpTypeIdVideo: - rtppkts = r.getVideoPacker().Pack(base.AvPacket{ - Timestamp: msg.Header.TimestampAbs, - PayloadType: r.videoPt, - Payload: msg.Payload[5:], - }) + packer = r.getVideoPacker() + if packer != nil { + rtppkts = r.getVideoPacker().Pack(base.AvPacket{ + Timestamp: msg.Header.TimestampAbs, + PayloadType: r.videoPt, + Payload: msg.Payload[5:], + }) + } } for i := range rtppkts { @@ -181,14 +188,18 @@ func (r *Rtmp2RtspRemuxer) remux(msg base.RtmpMsg) { } func (r *Rtmp2RtspRemuxer) getAudioPacker() *rtprtcp.RtpPacker { + if r.asc == nil { + return nil + } + if r.audioPacker == nil { // TODO(chef): ssrc随机产生,并且整个lal没有在setup信令中传递ssrc r.audioSsrc = rand.Uint32() - // TODO(chef): 如果rtmp不是以音视频头开始,也可能收到了帧数据,但是头不存在,目前该remux没有做过多容错判断,后续要加上,或者在输入层保证 ascCtx, err := aac.NewAscContext(r.asc) if err != nil { Log.Errorf("parse asc failed. err=%+v", err) + return nil } clockRate, err := ascCtx.GetSamplingFrequency() if err != nil { @@ -202,6 +213,9 @@ func (r *Rtmp2RtspRemuxer) getAudioPacker() *rtprtcp.RtpPacker { } func (r *Rtmp2RtspRemuxer) getVideoPacker() *rtprtcp.RtpPacker { + if r.sps == nil { + return nil + } if r.videoPacker == nil { r.videoSsrc = rand.Uint32() pp := rtprtcp.NewRtpPackerPayloadAvcHevc(r.videoPt, func(option *rtprtcp.RtpPackerPayloadAvcHevcOption) {