This is a Golang library to natively parse and demux MPEG Transport Streams (ts) in GO.
WARNING: this library is not yet production ready. For instance, while parsing a slice of bytes, it doesn't check whether the length of the slice is sufficient and rather panic on purpose. Use at your own risks!
To install the library use the following:
go get -u github.com/asticode/go-astits/...
The transport stream is made of packets.
Each packet has a header, an optional adaptation field and a payload.
Several payloads can be appended and parsed as a data.
TRANSPORT STREAM
+--------------------------------------------------------------------------------------------------+
| |
PACKET PACKET
+----------------------------------------------+----------------------------------------------+----
| | |
+--------+---------------------------+---------+--------+---------------------------+---------+
| HEADER | OPTIONAL ADAPTATION FIELD | PAYLOAD | HEADER | OPTIONAL ADAPTATION FIELD | PAYLOAD | ...
+--------+---------------------------+---------+--------+---------------------------+---------+
| | | |
+---------+ +---------+
| |
+----------------------------------------------+
DATA
WARNING: the code below doesn't handle errors for readability purposes. However you SHOULD!
// Create a cancellable context in case you want to stop reading packets/data any time you want
ctx, cancel := context.WithCancel(context.Background())
// Handle SIGTERM signal
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM)
go func() {
<-ch
cancel()
}()
// Open your file or initialize any kind of io.Reader
f, _ := os.Open("/path/to/file.ts")
defer f.Close()
// Create the demuxer
dmx := astits.New(ctx, f)
for {
// Get the next data
d, _ := dmx.NextData()
// Data is a PMT data
if d.PMT != nil {
// Loop through elementary streams
for _, es := range d.PMT.ElementaryStreams {
fmt.Printf("Stream detected: %d\n", es.ElementaryPID)
}
return
}
}
In order to pass options to the demuxer, look for the methods prefixed with Opt
and add them upon calling New
:
// This is your custom packets parser
p := func(ps []*astits.Packet) (ds []*astits.Data, skip bool, err error) {
// This is your logic
skip = true
return
}
// Now you can create a demuxer with the proper options
dmx := New(ctx, f, OptPacketSize(192), OptPacketsParser(p))
This library provides a CLI that will automatically get installed in GOPATH/bin
on go get
execution.
$ astits -i <path to your file> -f <format: text|json (default: text)>
$ astits data -i <path to your file> -d <data type: eit|nit|... (repeatable argument | if empty, all data types are shown)>
- Parse PES packets
- Parse PAT packets
- Parse PMT packets
- Parse EIT packets
- Parse NIT packets
- Parse SDT packets
- Parse TOT packets
- Parse BAT packets
- Parse DIT packets
- Parse RST packets
- Parse SIT packets
- Parse ST packets
- Parse TDT packets
- Parse TSDT packets