[fix] rtsp: 增强容错性,修复rtmp输入流没有seq header时,rtmp转rtsp内崩溃的问题

pull/137/head
q191201771 3 years ago
parent 92c0c723a6
commit b4c85d98ec

@ -159,21 +159,28 @@ func (r *Rtmp2RtspRemuxer) isAnalyzeEnough() bool {
} }
func (r *Rtmp2RtspRemuxer) remux(msg base.RtmpMsg) { func (r *Rtmp2RtspRemuxer) remux(msg base.RtmpMsg) {
var packer *rtprtcp.RtpPacker
var rtppkts []rtprtcp.RtpPacket var rtppkts []rtprtcp.RtpPacket
switch msg.Header.MsgTypeId { switch msg.Header.MsgTypeId {
case base.RtmpTypeIdAudio: case base.RtmpTypeIdAudio:
rtppkts = r.getAudioPacker().Pack(base.AvPacket{ packer = r.getAudioPacker()
if packer != nil {
rtppkts = packer.Pack(base.AvPacket{
Timestamp: msg.Header.TimestampAbs, Timestamp: msg.Header.TimestampAbs,
PayloadType: r.audioPt, PayloadType: r.audioPt,
Payload: msg.Payload[2:], Payload: msg.Payload[2:],
}) })
}
case base.RtmpTypeIdVideo: case base.RtmpTypeIdVideo:
packer = r.getVideoPacker()
if packer != nil {
rtppkts = r.getVideoPacker().Pack(base.AvPacket{ rtppkts = r.getVideoPacker().Pack(base.AvPacket{
Timestamp: msg.Header.TimestampAbs, Timestamp: msg.Header.TimestampAbs,
PayloadType: r.videoPt, PayloadType: r.videoPt,
Payload: msg.Payload[5:], Payload: msg.Payload[5:],
}) })
} }
}
for i := range rtppkts { for i := range rtppkts {
r.onRtpPacket(rtppkts[i]) r.onRtpPacket(rtppkts[i])
@ -181,14 +188,18 @@ func (r *Rtmp2RtspRemuxer) remux(msg base.RtmpMsg) {
} }
func (r *Rtmp2RtspRemuxer) getAudioPacker() *rtprtcp.RtpPacker { func (r *Rtmp2RtspRemuxer) getAudioPacker() *rtprtcp.RtpPacker {
if r.asc == nil {
return nil
}
if r.audioPacker == nil { if r.audioPacker == nil {
// TODO(chef): ssrc随机产生并且整个lal没有在setup信令中传递ssrc // TODO(chef): ssrc随机产生并且整个lal没有在setup信令中传递ssrc
r.audioSsrc = rand.Uint32() r.audioSsrc = rand.Uint32()
// TODO(chef): 如果rtmp不是以音视频头开始也可能收到了帧数据但是头不存在目前该remux没有做过多容错判断后续要加上或者在输入层保证
ascCtx, err := aac.NewAscContext(r.asc) ascCtx, err := aac.NewAscContext(r.asc)
if err != nil { if err != nil {
Log.Errorf("parse asc failed. err=%+v", err) Log.Errorf("parse asc failed. err=%+v", err)
return nil
} }
clockRate, err := ascCtx.GetSamplingFrequency() clockRate, err := ascCtx.GetSamplingFrequency()
if err != nil { if err != nil {
@ -202,6 +213,9 @@ func (r *Rtmp2RtspRemuxer) getAudioPacker() *rtprtcp.RtpPacker {
} }
func (r *Rtmp2RtspRemuxer) getVideoPacker() *rtprtcp.RtpPacker { func (r *Rtmp2RtspRemuxer) getVideoPacker() *rtprtcp.RtpPacker {
if r.sps == nil {
return nil
}
if r.videoPacker == nil { if r.videoPacker == nil {
r.videoSsrc = rand.Uint32() r.videoSsrc = rand.Uint32()
pp := rtprtcp.NewRtpPackerPayloadAvcHevc(r.videoPt, func(option *rtprtcp.RtpPackerPayloadAvcHevcOption) { pp := rtprtcp.NewRtpPackerPayloadAvcHevc(r.videoPt, func(option *rtprtcp.RtpPackerPayloadAvcHevcOption) {

Loading…
Cancel
Save