将ts解包置入引擎中

This commit is contained in:
dexter
2022-05-14 23:42:57 +08:00
parent ff31c7cd8e
commit 8dc20b9268
4 changed files with 101 additions and 26 deletions

View File

@@ -62,6 +62,7 @@ const (
// 0xFF Forbidden
STREAM_TYPE_H264 = 0x1B
STREAM_TYPE_H265 = 0x24
STREAM_TYPE_AAC = 0x0F
// 1110 xxxx
@@ -80,23 +81,23 @@ const (
//
type MpegTsStream struct {
firstTsPkt *MpegTsPacket // 每一帧的第一个TS包
patPkt *MpegTsPacket // 装载PAT的TS包
pmtPkt *MpegTsPacket // 装载PMT的TS包
pat *MpegTsPAT // PAT表信息
pmt *MpegTsPMT // PMT表信息
closed bool //是否已经关闭
TsPesPktChan chan *MpegTsPesStream // TS + PES Packet Channel,将封装的每一帧ES数据,通过channel来传输
firstTsPkt *MpegTsPacket // 每一帧的第一个TS包
patPkt *MpegTsPacket // 装载PAT的TS包
pmtPkt *MpegTsPacket // 装载PMT的TS包
pat *MpegTsPAT // PAT表信息
pmt *MpegTsPMT // PMT表信息
closed bool //是否已经关闭
// TsPesPktChan chan *MpegTsPesStream // TS + PES Packet Channel,将封装的每一帧ES数据,通过channel来传输
}
func NewMpegTsStream(bufferLength int) (ts *MpegTsStream) {
func NewMpegTsStream() (ts *MpegTsStream) {
ts = new(MpegTsStream)
ts.firstTsPkt = new(MpegTsPacket)
ts.patPkt = new(MpegTsPacket)
ts.pmtPkt = new(MpegTsPacket)
ts.pat = new(MpegTsPAT)
ts.pmt = new(MpegTsPMT)
ts.TsPesPktChan = make(chan *MpegTsPesStream, bufferLength)
// ts.TsPesPktChan = make(chan *MpegTsPesStream, bufferLength)
return
}
@@ -485,7 +486,7 @@ func WriteTsHeader(w io.Writer, header MpegTsHeader) (written int, err error) {
// return nil
//}
func (s *MpegTsStream) readPAT(packet *MpegTsPacket, pr io.Reader) (err error) {
func (s *MpegTsStream) ReadPAT(packet *MpegTsPacket, pr io.Reader) (err error) {
// 首先找到PID==0x00的TS包(PAT)
if PID_PAT == packet.Header.Pid {
if len(packet.Payload) == 188 {
@@ -501,7 +502,7 @@ func (s *MpegTsStream) readPAT(packet *MpegTsPacket, pr io.Reader) (err error) {
}
return
}
func (s *MpegTsStream) readPMT(packet *MpegTsPacket, pr io.Reader) (err error) {
func (s *MpegTsStream) ReadPMT(packet *MpegTsPacket, pr io.Reader) (err error) {
// 在读取PAT中已经将所有频道节目信息(PMT_PID)保存了起来
// 接着读取所有TS包里面的PID,找出PID==PMT_PID的TS包,就是PMT表
for _, v := range s.pat.Program {
@@ -521,7 +522,7 @@ func (s *MpegTsStream) readPMT(packet *MpegTsPacket, pr io.Reader) (err error) {
}
return
}
func (s *MpegTsStream) Feed(ts io.Reader) error {
func (s *MpegTsStream) Feed(ts io.Reader, onStream func(MpegTsPmtStream), onPES func(MpegTsPESPacket)) error {
var frame int64
var tsPktArr []MpegTsPacket
for {
@@ -532,21 +533,18 @@ func (s *MpegTsStream) Feed(ts io.Reader) error {
if err != nil {
return err
}
s.TsPesPktChan <- &MpegTsPesStream{
TsPkt: *s.firstTsPkt,
PesPkt: pesPkt,
}
onPES(pesPkt)
return nil
}
if err != nil {
return err
}
pr := bytes.NewReader(packet.Payload)
err = s.readPAT(&packet, pr)
err = s.ReadPAT(&packet, pr)
if err != nil {
return err
}
err = s.readPMT(&packet, pr)
err = s.ReadPMT(&packet, pr)
if err != nil {
return err
}
@@ -560,14 +558,11 @@ func (s *MpegTsStream) Feed(ts io.Reader) error {
if err != nil {
return err
}
s.TsPesPktChan <- &MpegTsPesStream{
TsPkt: *s.firstTsPkt,
PesPkt: pesPkt,
}
onPES(pesPkt)
tsPktArr = nil
}
s.firstTsPkt = &packet
onStream(v)
frame++
}
tsPktArr = append(tsPktArr, packet)