diff --git a/example/test.go b/example/test.go index f305a34..e97bb2e 100644 --- a/example/test.go +++ b/example/test.go @@ -195,23 +195,48 @@ func main() { return } + var w *ts.TSWriter + var sample Sample + writePES := func() (err error) { + pes := ts.PESHeader{ + StreamId: ts.StreamIdH264, + PTS: sample.PTS, + DTS: sample.DTS, + } + w.PCR = sample.PCR + bw := &bytes.Buffer{} + if err = ts.WritePES(bw, pes, sample.Data); err != nil { + return + } + if err = w.Write(bw.Bytes(), false); err != nil { + return + } + return + } + if file != nil { writePAT() writePMT() - file.Close() + w = &ts.TSWriter{ + W: file, + PID: 0x100, + } } for { - var sample Sample var ok bool if sample, ok = <-ch; !ok { break } if sample.Type == ts.ElementaryStreamTypeH264 { - if false { + if true { fmt.Println("sample: ", len(sample.Data), "PCR", sample.PCR) //fmt.Print(hex.Dump(sample.Data)) } + + if file != nil { + writePES() + } } } } diff --git a/reader.go b/reader.go index 23972de..648eff7 100644 --- a/reader.go +++ b/reader.go @@ -449,6 +449,10 @@ func ReadPESHeader(r io.Reader) (res *PESHeader, err error) { return } + if DebugReader { + fmt.Printf("pes: StreamId=%x\n", self.StreamId) + } + if length, err = ReadUInt(r, 2); err != nil { return } diff --git a/ts.go b/ts.go index c0e943e..da6e546 100644 --- a/ts.go +++ b/ts.go @@ -53,6 +53,11 @@ type PSI struct { LastSecNum uint } +const ( + StreamIdH264 = 0xe0 + StreamIdAAC = 0xc0 +) + type PESHeader struct { StreamId uint // H264=0xe0 AAC=0xc0 DataLength uint diff --git a/writer.go b/writer.go index d3945b5..368bb24 100644 --- a/writer.go +++ b/writer.go @@ -46,25 +46,29 @@ func WriteTSHeader(w io.Writer, self TSHeader) (err error) { flags |= (self.PID&0x1fff00)<<8 flags |= self.ContinuityCounter&0xf + const PCR = 0x10 + const OPCR = 0x08 + const EXT = 0x20 + if self.PCR != 0 { - extFlags |= 0x20 + extFlags |= PCR } if self.OPCR != 0 { - extFlags |= 0x08 + extFlags |= OPCR } if self.RandomAccessIndicator { extFlags |= 0x40 } if extFlags != 0 { - flags |= 0x20 + flags |= EXT } if err = WriteUInt(w, flags, 4); err != nil { return } - if flags & 0x20 != 0 { + if flags & EXT != 0 { var length uint // Discontinuity indicator 1 0x80 @@ -74,10 +78,10 @@ func WriteTSHeader(w io.Writer, self TSHeader) (err error) { // OPCR flag 1 0x08 length = 1 - if extFlags & 0x10 != 0 { + if extFlags & PCR != 0 { length += 6 } - if extFlags & 0x08 != 0 { + if extFlags & OPCR != 0 { length += 6 } @@ -88,13 +92,13 @@ func WriteTSHeader(w io.Writer, self TSHeader) (err error) { return } - if extFlags & 0x10 != 0 { + if extFlags & PCR != 0 { if err = WriteUInt64(w, PCRToUInt(self.PCR), 6); err != nil { return } } - if extFlags & 0x08 != 0 { + if extFlags & OPCR != 0 { if err = WriteUInt64(w, PCRToUInt(self.OPCR), 6); err != nil { return }