Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/asticode/go-astits
Demux and mux MPEG Transport Streams (.ts) natively in GO
https://github.com/asticode/go-astits
go golang golang-library mpeg mpeg-ts mpeg2 mpegts transport-stream
Last synced: 2 months ago
JSON representation
Demux and mux MPEG Transport Streams (.ts) natively in GO
- Host: GitHub
- URL: https://github.com/asticode/go-astits
- Owner: asticode
- License: mit
- Created: 2017-07-04T13:06:15.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-10-24T08:12:51.000Z (over 1 year ago)
- Last Synced: 2024-08-04T03:05:57.629Z (6 months ago)
- Topics: go, golang, golang-library, mpeg, mpeg-ts, mpeg2, mpegts, transport-stream
- Language: Go
- Homepage:
- Size: 3.02 MB
- Stars: 536
- Watchers: 23
- Forks: 52
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-video - go-astits - Parse and demux MPEG Transport Streams (.ts) natively in GO. (Language and platform specific libraries / Go)
- awesome-go - go-astits - Parse and demux MPEG Transport Streams (.ts) natively in GO - ★ 218 (Video)
- awesome-go-extra - go-astits - 07-04T13:06:15Z|2022-08-10T17:27:00Z| (Video / Fail injection)
README
[![GoReportCard](http://goreportcard.com/badge/github.com/asticode/go-astits)](http://goreportcard.com/report/github.com/asticode/go-astits)
[![GoDoc](https://godoc.org/github.com/asticode/go-astits?status.svg)](https://godoc.org/github.com/asticode/go-astits)
[![Test](https://github.com/asticode/go-astits/actions/workflows/test.yml/badge.svg)](https://github.com/asticode/go-astits/actions/workflows/test.yml)
[![Coveralls](https://coveralls.io/repos/github/asticode/go-astits/badge.svg?branch=master)](https://coveralls.io/github/asticode/go-astits)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/...
To install the executables use the following:
go install github.com/asticode/go-astits/cmd
# 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 codeWARNING: the code below doesn't handle errors for readability purposes. However you SHOULD!
## Demux
```go
// 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
```go
// 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` :
```go
// 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 -f
### List packets
$ astits-probe packets -i
### List data
$ astits-probe data -i -d
## astits-es-split
### Split streams into separate .ts files
$ astits-es-split -o
# 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