mirror of
https://github.com/Monibuca/plugin-ps.git
synced 2026-04-22 23:37:04 +08:00
feat: 对流中是否包含音视频进行提前判断
This commit is contained in:
+12
-9
@@ -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
@@ -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
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user