mirror of
https://github.com/Monibuca/plugin-ps.git
synced 2025-12-24 12:37:59 +08:00
feat: 对流中是否包含音视频进行提前判断
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ const (
|
||||
type EsHandler interface {
|
||||
ReceiveAudio(MpegPsEsStream)
|
||||
ReceiveVideo(MpegPsEsStream)
|
||||
ReceivePSM(util.Buffer)
|
||||
ReceivePSM(util.Buffer, bool, bool)
|
||||
}
|
||||
|
||||
type MpegPsEsStream struct {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user