go-astits alternatives and similar packages
Based on the "Video" category.
Alternatively, view go-astits alternatives based on common mentions on social networks and blogs.
-
M3U8
Parser and generator of M3U8-playlists for Apple HLS. Library for Go language. :cinema: -
gortsplib
RTSP 1.0 client and server library for the Go programming language -
go-astisub
Manipulate subtitles in GO (.srt, .ssa/.ass, .stl, .ttml, .vtt (webvtt), teletext, etc.) -
libvlc-go
Go bindings for libVLC and high-level media player interface -
gst
Go bindings for GStreamer (retired: currently I don't use/develop this package) -
go-m3u8
Parse and generate m3u8 playlists for Apple HTTP Live Streaming (HLS) in Golang (ported from gem https://github.com/sethdeckard/m3u8) -
go-mpd
Go library for parsing and generating MPEG-DASH Media Presentation Description (MPD) files -
golibnotify
Go bindings for libnotify -- Create and update OS notifications in linux
Static code analysis for 29 languages.
Do you think we are missing an alternative of go-astits or a related project?
README
This is a Golang library to natively demux and mux 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!
Demux
// 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
// Buffering using bufio.Reader is recommended for performance
f, _ := os.Open("/path/to/file.ts")
defer f.Close()
// Create the demuxer
dmx := astits.NewDemuxer(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
}
}
Mux
// Create a cancellable context in case you want to stop writing 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()
}()
// Create your file or initialize any kind of io.Writer
// Buffering using bufio.Writer is recommended for performance
f, _ := os.Create("/path/to/file.ts")
defer f.Close()
// Create the muxer
mx := astits.NewMuxer(ctx, f)
// Add an elementary stream
mx.AddElementaryStream(astits.PMTElementaryStream{
ElementaryPID: 1,
StreamType: astits.StreamTypeMetadata,
})
// Write tables
// Using that function is not mandatory, WriteData will retransmit tables from time to time
mx.WriteTables()
// Write data
mx.WriteData(&astits.MuxerData{
PES: &astits.PESData{
Data: []byte("test"),
},
PID: 1,
})
Options
In order to pass options to the demuxer or the muxer, look for the methods prefixed with DemuxerOpt
or MuxerOpt
and add them upon calling NewDemuxer
or NewMuxer
:
// 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 := NewDemuxer(ctx, f, DemuxerOptPacketSize(192), DemuxerOptPacketsParser(p))
CLI
This library provides 2 CLIs that will automatically get installed in GOPATH/bin
on go get
execution.
astits-probe
List streams
$ astits-probe -i <path to your file> -f <format: text|json (default: text)>
List packets
$ astits-probe packets -i <path to your file>
List data
$ astits-probe data -i <path to your file> -d <data type: eit|nit|... (repeatable argument | if empty, all data types are shown)>
astits-es-split
Split streams into separate .ts files
$ astits-es-split <path to your file> -o <path to output dir>
Features and roadmap
- [x] Add demuxer
- [x] Add muxer
- [x] Demux PES packets
- [x] Mux PES packets
- [x] Demux PAT packets
- [x] Mux PAT packets
- [x] Demux PMT packets
- [x] Mux PMT packets
- [x] Demux EIT packets
- [ ] Mux EIT packets
- [x] Demux NIT packets
- [ ] Mux NIT packets
- [x] Demux SDT packets
- [ ] Mux SDT packets
- [x] Demux TOT packets
- [ ] Mux TOT packets
- [ ] Demux BAT packets
- [ ] Mux BAT packets
- [ ] Demux DIT packets
- [ ] Mux DIT packets
- [ ] Demux RST packets
- [ ] Mux RST packets
- [ ] Demux SIT packets
- [ ] Mux SIT packets
- [ ] Mux ST packets
- [ ] Demux TDT packets
- [ ] Mux TDT packets
- [ ] Demux TSDT packets
- [ ] Mux TSDT packets