feat: 对流中是否包含音视频进行提前判断

This commit is contained in:
langhuihui
2023-11-10 09:31:28 +08:00
parent 703b480d18
commit 313a5e01c5
3 changed files with 17 additions and 11 deletions

View File

@@ -30,8 +30,8 @@ type DecPSPackage struct {
PTS uint32
DTS uint32
EsHandler
audio MpegPsEsStream
video MpegPsEsStream
audio *MpegPsEsStream
video *MpegPsEsStream
}
func (dec *DecPSPackage) clean() {
@@ -95,16 +95,15 @@ loop:
err = dec.decProgramStreamMap()
case StartCodeVideo:
payload, err = dec.ReadPayload()
if err == nil {
if err == nil && dec.video != nil {
if frame, err = dec.video.parsePESPacket(payload); err == nil && frame.Buffer.Len() > 0 {
dec.ReceiveVideo(frame)
}
}
case StartCodeAudio:
payload, err = dec.ReadPayload()
if err == nil {
frame, err = dec.audio.parsePESPacket(payload)
if err == nil && frame.Buffer.Len() > 0 {
if err == nil && dec.audio != nil {
if frame, err = dec.audio.parsePESPacket(payload); err == nil && frame.Buffer.Len() > 0 {
dec.ReceiveAudio(frame)
}
}
@@ -156,7 +155,6 @@ func (dec *DecPSPackage) decProgramStreamMap() error {
if err != nil {
return err
}
defer dec.EsHandler.ReceivePSM(psm)
l := len(psm)
index := 2
programStreamInfoLen := util.BigEndian.Uint16(psm[index:])
@@ -173,9 +171,13 @@ func (dec *DecPSPackage) decProgramStreamMap() error {
elementaryStreamID := psm[index]
index++
if elementaryStreamID >= 0xe0 && elementaryStreamID <= 0xef {
dec.video.Type = streamType
dec.video = &MpegPsEsStream{
Type: streamType,
}
} else if elementaryStreamID >= 0xc0 && elementaryStreamID <= 0xdf {
dec.audio.Type = streamType
dec.audio = &MpegPsEsStream{
Type: streamType,
}
}
if l <= index+1 {
break
@@ -185,5 +187,6 @@ func (dec *DecPSPackage) decProgramStreamMap() error {
index += int(elementaryStreamInfoLength)
programStreamMapLen -= 4 + elementaryStreamInfoLength
}
dec.EsHandler.ReceivePSM(psm, dec.audio != nil, dec.video != nil)
return nil
}

View File

@@ -21,7 +21,7 @@ const (
type EsHandler interface {
ReceiveAudio(MpegPsEsStream)
ReceiveVideo(MpegPsEsStream)
ReceivePSM(util.Buffer)
ReceivePSM(util.Buffer, bool, bool)
}
type MpegPsEsStream struct {

View File

@@ -310,10 +310,13 @@ func (p *PSPublisher) Replay(f *os.File) (err error) {
}
return
}
func (p *PSPublisher) ReceivePSM(buf util.Buffer) {
func (p *PSPublisher) ReceivePSM(buf util.Buffer, hasAudio bool, hasVideo bool) {
if p.relayTrack != nil {
p.relayTrack.PSM = buf.Clone()
}
p.Config.PubAudio = hasAudio
p.Config.PubVideo = hasVideo
}
func (p *PSPublisher) Receive(streamPath, dump, port string, ssrc uint32, reuse bool) (err error) {