// Copyright 2020, Chef. All rights reserved. // https://github.com/q191201771/lal // // Use of this source code is governed by a MIT-style license // that can be found in the License file. // // Author: Chef (191201771@qq.com) package main import ( "os" "github.com/q191201771/lal/pkg/base" "github.com/q191201771/lal/pkg/aac" "github.com/q191201771/lal/pkg/rtsp" "github.com/q191201771/naza/pkg/nazalog" ) type Obs struct { } var obs Obs var aacFp *os.File var avcFp *os.File var a aac.ADTS func (obs *Obs) OnASC(asc []byte) { _ = a.InitWithAACAudioSpecificConfig(asc) } func (obs *Obs) OnSPSPPS(sps, pps []byte) { _, _ = avcFp.Write([]byte{0, 0, 0, 1}) _, _ = avcFp.Write(sps) _, _ = avcFp.Write([]byte{0, 0, 0, 1}) _, _ = avcFp.Write(pps) } func (obs *Obs) OnAVPacket(pkt base.AVPacket) { nazalog.Debugf("type=%d, ts=%d, len=%d", pkt.PayloadType, pkt.Timestamp, len(pkt.Payload)) switch pkt.PayloadType { case base.RTPPacketTypeAVC: // TODO chef: 由于存在多nalu情况,需要进行拆分 //_, _ = avcFp.Write([]byte{0, 0, 0, 1}) //_, _ = avcFp.Write(pkt.Payload) //_ = avcFp.Sync() case base.RTPPacketTypeAAC: h, _ := a.CalcADTSHeader(uint16(len(pkt.Payload))) _, _ = aacFp.Write(h) _, _ = aacFp.Write(pkt.Payload) _ = aacFp.Sync() } } func (obs *Obs) OnNewRTSPPubSession(session *rtsp.PubSession) bool { nazalog.Debugf("OnNewRTSPPubSession. %+v", session) var err error avcFp, err = os.Create("/tmp/rtsp.h264") nazalog.Assert(nil, err) aacFp, err = os.Create("/tmp/rtsp.aac") nazalog.Assert(nil, err) session.SetObserver(obs) return true } func (obs *Obs) OnDelRTSPPubSession(session *rtsp.PubSession) { nazalog.Debugf("OnDelRTSPPubSession. %+v", session) } func main() { var obs Obs s := rtsp.NewServer(":5544", &obs) err := s.Listen() nazalog.Assert(nil, err) err = s.RunLoop() nazalog.Error(err) }