Skip to content
Parse and demux MPEG Transport Streams (.ts) natively in GO
Go
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
astits Removed astilog/errors dependencies Jan 8, 2020
doc Fixed iso639 descriptor Jan 5, 2019
.gitignore Initial commit Nov 25, 2017
.travis.yml
LICENSE
README.md Updated README Sep 26, 2019
clock_reference.go Initial commit Nov 25, 2017
clock_reference_test.go Initial commit Nov 25, 2017
data.go Removed astilog/errors dependencies Jan 8, 2020
data_eit.go Removed astilog/errors dependencies Jan 8, 2020
data_eit_test.go Now using astikit instead of astitools Dec 31, 2019
data_nit.go Removed astilog/errors dependencies Jan 8, 2020
data_nit_test.go Now using astikit instead of astitools Dec 31, 2019
data_pat.go Removed astilog/errors dependencies Jan 8, 2020
data_pat_test.go
data_pes.go
data_pes_test.go Now using astikit instead of astitools Dec 31, 2019
data_pmt.go Removed astilog/errors dependencies Jan 8, 2020
data_pmt_test.go
data_psi.go Removed astilog/errors dependencies Jan 8, 2020
data_psi_test.go Now using astikit instead of astitools Dec 31, 2019
data_sdt.go
data_sdt_test.go Now using astikit instead of astitools Dec 31, 2019
data_test.go
data_tot.go Removed astilog/errors dependencies Jan 8, 2020
data_tot_test.go Now using astikit instead of astitools Dec 31, 2019
demuxer.go Removed astilog/errors dependencies Jan 8, 2020
demuxer_test.go
descriptor.go
descriptor_test.go Now using astikit instead of astitools Dec 31, 2019
dvb.go Removed astilog/errors dependencies Jan 8, 2020
dvb_test.go Now using astikit instead of astitools Dec 31, 2019
go.mod Removed astilog/errors dependencies Jan 8, 2020
go.sum
packet.go Removed astilog/errors dependencies Jan 8, 2020
packet_buffer.go Removed astilog/errors dependencies Jan 8, 2020
packet_buffer_test.go Now using astikit instead of astitools Dec 31, 2019
packet_pool.go
packet_pool_test.go Updated packet pool add strategy regarding errors Dec 16, 2017
packet_test.go
program_map.go
program_map_test.go Initial commit Nov 25, 2017

README.md

GoReportCard GoDoc Travis Coveralls

This is a Golang library to natively parse and demux MPEG Transport Streams (ts) in GO.

WARNING: this library is not yet production ready. Use at your own risks!

Installation

To install the library use the following:

go get -u github.com/asticode/go-astits/...

Before looking at the code...

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

Using the library in your code

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
    }
}

Options

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))

CLI

This library provides a CLI that will automatically get installed in GOPATH/bin on go get execution.

List streams

$ astits -i <path to your file> -f <format: text|json (default: text)>

List packets

$ astits packets -i <path to your file>

List data

$ astits data -i <path to your file> -d <data type: eit|nit|... (repeatable argument | if empty, all data types are shown)>

Features and roadmap

  • 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
You can’t perform that action at this time.