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
+12 -9
View File
@@ -30,8 +30,8 @@ type DecPSPackage struct {
PTS uint32 PTS uint32
DTS uint32 DTS uint32
EsHandler EsHandler
audio MpegPsEsStream audio *MpegPsEsStream
video MpegPsEsStream video *MpegPsEsStream
} }
func (dec *DecPSPackage) clean() { func (dec *DecPSPackage) clean() {
@@ -95,16 +95,15 @@ loop:
err = dec.decProgramStreamMap() err = dec.decProgramStreamMap()
case StartCodeVideo: case StartCodeVideo:
payload, err = dec.ReadPayload() 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 { if frame, err = dec.video.parsePESPacket(payload); err == nil && frame.Buffer.Len() > 0 {
dec.ReceiveVideo(frame) dec.ReceiveVideo(frame)
} }
} }
case StartCodeAudio: case StartCodeAudio:
payload, err = dec.ReadPayload() payload, err = dec.ReadPayload()
if err == nil { if err == nil && dec.audio != nil {
frame, err = dec.audio.parsePESPacket(payload) if frame, err = dec.audio.parsePESPacket(payload); err == nil && frame.Buffer.Len() > 0 {
if err == nil && frame.Buffer.Len() > 0 {
dec.ReceiveAudio(frame) dec.ReceiveAudio(frame)
} }
} }
@@ -156,7 +155,6 @@ func (dec *DecPSPackage) decProgramStreamMap() error {
if err != nil { if err != nil {
return err return err
} }
defer dec.EsHandler.ReceivePSM(psm)
l := len(psm) l := len(psm)
index := 2 index := 2
programStreamInfoLen := util.BigEndian.Uint16(psm[index:]) programStreamInfoLen := util.BigEndian.Uint16(psm[index:])
@@ -173,9 +171,13 @@ func (dec *DecPSPackage) decProgramStreamMap() error {
elementaryStreamID := psm[index] elementaryStreamID := psm[index]
index++ index++
if elementaryStreamID >= 0xe0 && elementaryStreamID <= 0xef { if elementaryStreamID >= 0xe0 && elementaryStreamID <= 0xef {
dec.video.Type = streamType dec.video = &MpegPsEsStream{
Type: streamType,
}
} else if elementaryStreamID >= 0xc0 && elementaryStreamID <= 0xdf { } else if elementaryStreamID >= 0xc0 && elementaryStreamID <= 0xdf {
dec.audio.Type = streamType dec.audio = &MpegPsEsStream{
Type: streamType,
}
} }
if l <= index+1 { if l <= index+1 {
break break
@@ -185,5 +187,6 @@ func (dec *DecPSPackage) decProgramStreamMap() error {
index += int(elementaryStreamInfoLength) index += int(elementaryStreamInfoLength)
programStreamMapLen -= 4 + elementaryStreamInfoLength programStreamMapLen -= 4 + elementaryStreamInfoLength
} }
dec.EsHandler.ReceivePSM(psm, dec.audio != nil, dec.video != nil)
return nil return nil
} }
+1 -1
View File
@@ -21,7 +21,7 @@ const (
type EsHandler interface { type EsHandler interface {
ReceiveAudio(MpegPsEsStream) ReceiveAudio(MpegPsEsStream)
ReceiveVideo(MpegPsEsStream) ReceiveVideo(MpegPsEsStream)
ReceivePSM(util.Buffer) ReceivePSM(util.Buffer, bool, bool)
} }
type MpegPsEsStream struct { type MpegPsEsStream struct {
+4 -1
View File
@@ -310,10 +310,13 @@ func (p *PSPublisher) Replay(f *os.File) (err error) {
} }
return return
} }
func (p *PSPublisher) ReceivePSM(buf util.Buffer) {
func (p *PSPublisher) ReceivePSM(buf util.Buffer, hasAudio bool, hasVideo bool) {
if p.relayTrack != nil { if p.relayTrack != nil {
p.relayTrack.PSM = buf.Clone() 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) { func (p *PSPublisher) Receive(streamPath, dump, port string, ssrc uint32, reuse bool) (err error) {