Comments (6)
If there are multiple rendition groups, stringify()
writes the variants per group.
It can read this file:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_high",NAME="English",DEFAULT=YES,URI="aac_high_eng.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_high",NAME="Japanese",DEFAULT=NO,URI="aac_high_jp.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_mid",NAME="English",DEFAULT=YES,URI="aac_mid_eng.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_mid",NAME="Japanese",DEFAULT=NO,URI="aac_mid_jp.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_low",NAME="English",DEFAULT=YES,URI="aac_low_eng.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_low",NAME="Japanese",DEFAULT=NO,URI="aac_low_jp.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=6000000,AUDIO="aac_high"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,AUDIO="aac_mid"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,AUDIO="aac_mid"
540p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,AUDIO="aac_low"
360p.m3u8
However, it writes like this:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_high",NAME="English",DEFAULT=YES,URI="aac_high_eng.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_high",NAME="Japanese",DEFAULT=NO,URI="aac_high_jp.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=6000000,AUDIO="aac_high"
1080p.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_mid",NAME="English",DEFAULT=YES,URI="aac_mid_eng.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_mid",NAME="Japanese",DEFAULT=NO,URI="aac_mid_jp.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=3000000,AUDIO="aac_mid"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,AUDIO="aac_mid"
540p.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_low",NAME="English",DEFAULT=YES,URI="aac_low_eng.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac_low",NAME="Japanese",DEFAULT=NO,URI="aac_low_jp.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1000000,AUDIO="aac_low"
360p.m3u8
from hls-parser.
No, that’s not my behavior. And I've never seen variants by group in a master playlist HLS in the real life, a correction must be made (I can create a PR).
from hls-parser.
Can you provide expected/actual manifests and what issue was caused by the actual manifest?
Your first example only has one rendition per group, which looks unrealistic to me.
from hls-parser.
With 3 audio rendition group you will see the issue :
File read:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_aacl",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_aacl.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_aac",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_aac.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_heaac",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_heaac.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8277095,AVERAGE-BANDWIDTH=6670088,CODECS="avc1.640028,mp4a.40.5",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_aacl"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_aacl"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_aacl"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_aacl"
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=8417895,AVERAGE-BANDWIDTH=6810888,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_aac"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5094830,AVERAGE-BANDWIDTH=3810268,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_aac"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_aac"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_aac"
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=8277095,AVERAGE-BANDWIDTH=6670088,CODECS="avc1.640028,mp4a.40.1",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_heaac"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_heaac"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_heaac"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_heaac"
360p.m3u8
Actual :
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_aacl",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_aacl.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8277095,AVERAGE-BANDWIDTH=6670088,CODECS="avc1.640028,mp4a.40.5",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_aacl"
1080p.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_aac",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_aac.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8417895,AVERAGE-BANDWIDTH=6810888,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_aac"
1080p.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_heaac",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_heaac.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8277095,AVERAGE-BANDWIDTH=6670088,CODECS="avc1.640028,mp4a.40.1",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_heaac"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_aacl"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_aacl"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_aacl"
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5094830,AVERAGE-BANDWIDTH=3810268,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_aac"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_aac"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_aac"
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_heaac"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_heaac"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_heaac"
360p.m3u8
from hls-parser.
The current version of stringify()
actually generates the following playlist:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_aacl",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_aacl.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8277095,AVERAGE-BANDWIDTH=6670088,CODECS="avc1.640028,mp4a.40.5",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_aacl"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_aacl"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_aacl"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_aacl"
360p.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_aac",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_aac.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8417895,AVERAGE-BANDWIDTH=6810888,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_aac"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5094830,AVERAGE-BANDWIDTH=3810268,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_aac"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_aac"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.5",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_aac"
360p.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio_heaac",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="eng_heaac.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=8277095,AVERAGE-BANDWIDTH=6670088,CODECS="avc1.640028,mp4a.40.1",RESOLUTION=1920x1080,FRAME-RATE=29.970,AUDIO="audio_heaac"
1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=1280x720,FRAME-RATE=29.970,AUDIO="audio_heaac"
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=858x480,FRAME-RATE=29.970,AUDIO="audio_heaac"
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5235630,AVERAGE-BANDWIDTH=3951068,CODECS="avc1.4D401F,mp4a.40.1",RESOLUTION=480x360,FRAME-RATE=29.970,AUDIO="audio_heaac"
360p.m3u8
Dis you observe any playback issue with the above playlist?
Or, did you see a playlist written differently by some products?
from hls-parser.
BTW, the playlist examples in the HLS spec suggest 2 patterns of multiple rendition groups:
- 9.7. Multivariant Playlist with Alternative Video
Variants are listed per rendition groups:
#EXTM3U
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Main", \
DEFAULT=YES,URI="low/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Centerfield", \
DEFAULT=NO,URI="low/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Dugout", \
DEFAULT=NO,URI="low/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",VIDEO="low"
low/main/audio-video.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Main", \
DEFAULT=YES,URI="mid/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Centerfield", \
DEFAULT=NO,URI="mid/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Dugout", \
DEFAULT=NO,URI="mid/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",VIDEO="mid"
mid/main/audio-video.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Main", \
DEFAULT=YES,URI="hi/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Centerfield", \
DEFAULT=NO,URI="hi/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Dugout", \
DEFAULT=NO,URI="hi/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",VIDEO="hi"
hi/main/audio-video.m3u8
- 9.12. Content Steering Playlist and Manifest
Variants are listed separately:
#EXTM3U
#EXT-X-CONTENT-STEERING:SERVER-URI="/steering?video=00012", \
PATHWAY-ID="CDN-A"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="A",NAME="English",DEFAULT=YES, \
URI="eng.m3u8",LANGUAGE="en",STABLE-RENDITION-ID="Audio-37262"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="B",NAME="ENGLISH",DEFAULT=YES, \
URI="https://b.example.com/content/videos/video12/eng.m3u8", \
LANGUAGE="en",STABLE-RENDITION-ID="Audio-37262"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AUDIO="A",PATHWAY-ID="CDN-A", \
STABLE-VARIANT-ID="Video-128"
low/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,AUDIO="A",PATHWAY-ID="CDN-A", \
STABLE-VARIANT-ID="Video-768"
hi/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AUDIO="B",PATHWAY-ID="CDN-B", \
STABLE-VARIANT-ID="Video-128"
https://backup.example.com/content/videos/video12/low/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,AUDIO="B",PATHWAY-ID="CDN-B", \
STABLE-VARIANT-ID="Video-768"
https://backup.example.com/content/videos/video12/hi/video.m3u8
Though the spec does not state which pattern is correct, I'm open to discuss based on the examples in real life.
Please let me know if you observe any issues with the current behavior.
from hls-parser.
Related Issues (20)
- Encryption with no IV (missing default behaviour)
- Issue with hls.stringify for cloned hls object
- support buffered input for hls.parse & buffered output for hls.stringify
- Release the last version HOT 2
- Error when using `noImplicitAny` in a typescript project HOT 6
- Not working in the browser? HOT 1
- When specifying several EXT-X-KEY one after another(multi drm playlist), only the last EXT-X-KEY is assigned to the segments HOT 4
- Invalid Playlist: The EXT-X-MEDIA-SEQUENCE tag MUST appear before the first Media Segment in the Playlist HOT 2
- If you try to output a playlist in HLS-V4 format, an error will occur. HOT 7
- Handling ad markers SCTE-35 HOT 2
- Correctly stringify bytrange of EXT-X-MAP
- Multiple markers is unsupported HOT 1
- The library doesn't parse EXT-X-PART tag HOT 1
- EXT-X-DATERANGE tags with no START-DATE attribute are not ignored with strictMode disabled HOT 1
- Issue in maintaining segment key when splicing the segment HOT 7
- License HOT 4
- support for EXT-X-PREFETCH HOT 5
- Support HLS versions 8 and above HOT 4
- EXT-X-BYTERANGE should come after other segment information HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from hls-parser.