This is an actively maintained fork of go module https://github.com/quangngotan95/go-m3u8, initally intended for internal use only and later made public.
Golang package for m3u8 (ported m3u8 gem https://github.com/sethdeckard/m3u8)
go-m3u8 provides easy generation and parsing of m3u8 playlists defined in the HTTP Live Streaming (HLS) Internet Draft published by Apple.
- The library completely implements version 20 of the HLS Internet Draft.
- Provides parsing of an m3u8 playlist into an object model from any File, io.Reader or string.
- Provides ability to write playlist to a string via String()
- Distinction between a master and media playlist is handled automatically (single Playlist class).
- Optionally, the library can automatically generate the audio/video codecs string used in the CODEC attribute based on specified H.264, AAC, or MP3 options (such as Profile/Level).
go get github.com/etherlabsio/go-m3u8
Create a master playlist and child playlists for adaptive bitrate streaming:
import ( "github.com/etherlabsio/go-m3u8/m3u8" "github.com/AlekSi/pointer" ) playlist := m3u8.NewPlaylist()Create a new playlist item:
item := &m3u8.PlaylistItem{ Width: pointer.ToInt(1920), Height: pointer.ToInt(1080), Profile: pointer.ToString("high"), Level: pointer.ToString("4.1"), AudioCodec: pointer.ToString("aac-lc"), Bandwidth: 540, URI: "test.url", } playlist.AppendItem(item)Add alternate audio, camera angles, closed captions and subtitles by creating MediaItem instances and adding them to the Playlist:
item := &m3u8.MediaItem{ Type: "AUDIO", GroupID: "audio-lo", Name: "Francais", Language: pointer.ToString("fre"), AssocLanguage: pointer.ToString("spoken"), AutoSelect: pointer.ToBool(true), Default: pointer.ToBool(false), Forced: pointer.ToBool(true), URI: pointer.ToString("frelo/prog_index.m3u8"), } playlist.AppendItem(item)Create a standard playlist and add MPEG-TS segments via SegmentItem. You can also specify options for this type of playlist, however these options are ignored if playlist becomes a master playlist (anything but segments added):
playlist := &m3u8.Playlist{ Target: 12, Sequence: 1, Version: pointer.ToInt(1), Cache: pointer.ToBool(false), Items: []m3u8.Item{ &m3u8.SegmentItem{ Duration: 11, Segment: "test.ts", }, }, }You can also access the playlist as a string:
var str string str = playlist.String() ... fmt.Print(playlist)Alternatively you can set codecs rather than having it generated automatically:
item := &m3u8.PlaylistItem{ Width: pointer.ToInt(1920), Height: pointer.ToInt(1080), Codecs: pointer.ToString("avc1.66.30,mp4a.40.2"), Bandwidth: 540, URI: "test.url", }Parse from file
playlist, err := m3u8.ReadFile("path/to/file")Read from string
playlist, err := m3u8.ReadString(string)Read from generic io.Reader
playlist, err := m3u8.Read(reader)Access items in playlist:
gore> playlist.Items[0] (*m3u8.SessionKeyItem)#EXT-X-SESSION-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52" gore> playlist.Items[1] (*m3u8.PlaybackStart)#EXT-X-START:TIME-OFFSET=20.2Codecs:
- Values for audio_codec (codec name): aac-lc, he-aac, mp3
- Values for profile (H.264 Profile): baseline, main, high.
- Values for level (H.264 Level): 3.0, 3.1, 4.0, 4.1.
Not all Levels and Profiles can be combined and validation is not currently implemented, consult H.264 documentation for further details.
- Fork it https://github.com/etherlabsio/go-m3u8/fork
- Create your feature branch
git checkout -b my-new-feature - Run tests
go test ./test/..., make sure they all pass and new features are covered - Commit your changes
git commit -am "Add new features" - Push to the branch
git push origin my-new-feature - Create a new Pull Request
MIT License - See LICENSE for details