// Copyright 2020, Chef. All rights reserved. // https://github.com/q191201771/lal // // Use of this source code is governed by a MIT-style license // that can be found in the License file. // // Author: Chef (191201771@qq.com) package main import ( "io/ioutil" "github.com/q191201771/lal/pkg/mpegts" "github.com/q191201771/lal/pkg/hls" "github.com/q191201771/naza/pkg/nazalog" ) // 学习如何解析TS文件。注意,该程序还没有写完。 var ( pat mpegts.PAT pmt mpegts.PMT pid2stream map[uint16]*Stream ) type Stream struct { } var filename = "/Volumes/Data/nrm-0.ts" func handlePacket(packet []byte) { h := mpegts.ParseTSPacketHeader(packet) index := 4 nazalog.Debugf("%+v", h) var adaptation mpegts.TSPacketAdaptation switch h.Adaptation { case mpegts.AdaptationFieldControlNo: // noop case mpegts.AdaptationFieldControlFollowed: adaptation = mpegts.ParseTSPacketAdaptation(packet[4:]) index++ default: nazalog.Warn(h.Adaptation) } index += int(adaptation.Length) if h.Pid == mpegts.PidPAT { if h.PayloadUnitStart == 1 { index++ } pat = mpegts.ParsePAT(packet[index:]) nazalog.Debugf("%+v", pat) return } if pat.SearchPID(h.Pid) { if h.PayloadUnitStart == 1 { index++ } pmt = mpegts.ParsePMT(packet[index:]) nazalog.Debugf("%+v", pmt) for _, ele := range pmt.ProgramElements { pid2stream[ele.Pid] = &Stream{} } return } _, ok := pid2stream[h.Pid] if !ok { nazalog.Warn(h.Pid) } // 判断是否有PES if h.PayloadUnitStart == 1 { pes, length := mpegts.ParsePES(packet[index:]) nazalog.Debugf("%+v, %d", pes, length) } } func main() { _ = nazalog.Init(func(option *nazalog.Option) { option.AssertBehavior = nazalog.AssertFatal }) defer nazalog.Sync() pid2stream = make(map[uint16]*Stream) content, err := ioutil.ReadFile(filename) nazalog.Assert(nil, err) packets, _ := hls.SplitFragment2TSPackets(content) for _, packet := range packets { handlePacket(packet) } }