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