joy4/example/test.go
2015-12-02 12:46:07 +08:00

109 lines
2.0 KiB
Go

package main
import (
"bytes"
"os"
"io"
ts "../"
"fmt"
"encoding/hex"
)
type Stream struct {
PID uint
Header *ts.PESHeader
Title string
Data bytes.Buffer
}
func main() {
var file *os.File
var err error
if file, err = os.Open("tiny2.ts"); err != nil {
return
}
data := [188]byte{}
var n int
var header ts.TSHeader
var pat ts.PAT
var pmt ts.PMT
var payload []byte
var info ts.ElementaryStreamInfo
streams := map[uint]*Stream{}
findOrCreateStream := func(pid uint) (stream *Stream) {
stream, _ = streams[pid]
if stream == nil {
stream = &Stream{
PID: pid,
}
if info.StreamType == ts.ElementaryStreamTypeH264 {
stream.Title = "h264"
} else if info.StreamType == ts.ElementaryStreamTypeAdtsAAC {
stream.Title = "aac"
}
streams[pid] = stream
}
return
}
onStreamPayload := func() (err error) {
stream := findOrCreateStream(header.PID)
r := bytes.NewReader(payload)
lr := &io.LimitedReader{R: r, N: int64(len(payload))}
if header.PayloadUnitStart {
stream.Data = bytes.Buffer{}
if stream.Header, err = ts.ReadPESHeader(lr); err != nil {
return
}
}
if _, err = io.CopyN(&stream.Data, lr, lr.N); err != nil {
return
}
if stream.Data.Len() == int(stream.Header.DataLength) {
fmt.Println(stream.Title, stream.Data.Len(), "total")
fmt.Println(hex.Dump(stream.Data.Bytes()))
}
return
}
for {
if header, n, err = ts.ReadTSPacket(file, data[:]); err != nil {
return
}
//fmt.Println(header, n)
payload = data[:n]
if header.PID == 0 {
if pat, err = ts.ReadPAT(bytes.NewReader(payload)); err != nil {
return
}
}
for _, entry := range(pat.Entries) {
if entry.ProgramMapPID == header.PID {
//fmt.Println("matchs", entry)
if pmt, err = ts.ReadPMT(bytes.NewReader(payload)); err != nil {
return
}
//fmt.Println("pmt", pmt)
if false {
fmt.Println(hex.Dump(payload))
}
}
}
for _, info = range(pmt.ElementaryStreamInfos) {
if info.ElementaryPID == header.PID {
onStreamPayload()
}
}
}
}