Closed crazytoad closed 3 years ago
Some information about the stream: It's CMAF with 3 video quality levels and a single audio track.
Example playlist:
#EXTM3U
#EXT-X-VERSION:5
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="Audio",NAME="240p",URI="cl_w3492934_b161311_ao_sfm4s_ZX8tdXM=.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=3000000,NAME="720p 3.0mbps",LANGUAGE="en-us",CODECS="avc1.4d4c1f,mp4a.40.2",RESOLUTION=1080x720,AUDIO="Audio"
cl_w3492934_b3000000_vo_sfm4s_ZX8tdXM=.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,NAME="360p 1.0mbps",LANGUAGE="en-us",CODECS="avc1.4d4c1e,mp4a.40.2",RESOLUTION=540x360,AUDIO="Audio"
cl_w3492934_b1000000_vo_sfm4s_ZX8tdXM=.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=500000,NAME="240p 500kbps",LANGUAGE="en-us",CODECS="avc1.4d4c15,mp4a.40.2",RESOLUTION=320x240,AUDIO="Audio"
cl_w3492934_b500000_vo_sfm4s_ZX8tdXM=.m3u8
When the problem happens, the demo timeline and stats don't show any buffering - the duration and latency just keep climbing:
Buffered:
Seekable: [0, 67]
Played:
Dropped frames: 0
Corrupted frames: 0
Bandwidth Estimate: 500000.000
Live Stats:
Max Latency: Infinity
Target Latency: 3.003
Latency: 67.00218994140624
Edge Stall: 0
Playback rate: 1.00
Example playlist: That's the manifest. The playlist has a lot of issues:
#EXTM3U #EXT-X-VERSION:6 #EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=3.0,CAN-SKIP-UNTIL=6.0 #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-TARGETDURATION:1 #EXT-X-MEDIA-SEQUENCE:14853 #EXT-X-PART-INF:PART-TARGET=1.0 #EXT-X-RENDITION-REPORT:URI="chunklist_w1785578074_b1400000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=.m3u8?_HLS_msn=14857&_HLS_part=1&_HLS_skip=YES&nc=0.3943549291741461",LAST-MSN=14858,LAST-PART=0 #EXT-X-RENDITION-REPORT:URI="chunklist_w1785578074_b750000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=.m3u8?_HLS_msn=14857&_HLS_part=1&_HLS_skip=YES&nc=0.3943549291741461",LAST-MSN=14858,LAST-PART=0 #EXT-X-MAP:URI="header_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_m3u8.cmfv?nc=0.3943549291741461" #EXT-X-PROGRAM-DATE-TIME:2021-02-20T05:12:49.108+00:00 #EXTINF:1.0, media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14853_m3u8.cmfv?nc=0.3943549291741461 #EXT-X-PROGRAM-DATE-TIME:2021-02-20T05:12:49.860+00:00 #EXTINF:1.0, media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14854_m3u8.cmfv?nc=0.3943549291741461 #EXT-X-PROGRAM-DATE-TIME:2021-02-20T05:12:50.860+00:00 #EXT-X-PART:DURATION=1.0,URI="media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14855.0_m3u8.cmfv?nc=0.3943549291741461",INDEPENDENT=YES #EXTINF:1.0, media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14855_m3u8.cmfv?nc=0.3943549291741461 #EXT-X-PROGRAM-DATE-TIME:2021-02-20T05:12:51.860+00:00 #EXT-X-PART:DURATION=1.0,URI="media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14856.0_m3u8.cmfv?nc=0.3943549291741461",INDEPENDENT=YES #EXTINF:1.0, media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14856_m3u8.cmfv?nc=0.3943549291741461 #EXT-X-PROGRAM-DATE-TIME:2021-02-20T05:12:52.862+00:00 #EXT-X-PART:DURATION=1.0,URI="media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14857.0_m3u8.cmfv?nc=0.3943549291741461",INDEPENDENT=YES #EXTINF:1.0, media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14857_m3u8.cmfv?nc=0.3943549291741461 #EXT-X-PROGRAM-DATE-TIME:2021-02-20T05:12:53.863+00:00 #EXT-X-PART:DURATION=1.0,URI="media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14858.0_m3u8.cmfv?nc=0.3943549291741461",INDEPENDENT=YES #EXTINF:1.0, media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14858_m3u8.cmfv?nc=0.3943549291741461 #EXT-X-PRELOAD-HINT:TYPE=PART,URI="media_w1785578074_b3600000_vo_sfm4s_t64NzIwcCAzLjZtYnBzIixMQU5HVUFHRT0iZW4tdXM=_14859.0_m3u8.cmfv?nc=0.3943549291741461"
Only one part per segment (except for the last one), so the non-LL segments are ahead of the LL parts. The PDT value differences do match the segment durations (they should all be one segment apart).
In the logs above, I've spotted some issues with hls.js attempting to find the next fragment based on PDT, and PDT not being set on a fragment even though it's present on others. That I can address, but once that is taken care of the stream then fails to start 100% of the time because of the issues listed above causing hls.js to request the last part. The stream updates the playlist, removing the part and responds with a 410 error. At that point the player cannot recover.
If you filter the console logs to just show lines with startPosition
you'll see the audio and video start out of sync:
[audio-stream-controller]: Configure startPosition to 0
[stream-controller]: Configure startPosition to 16.997284912109375
This happens when the audio track playlist loads before the main level, and so the start position is set before the two playlists are aligned. Just added a fix to #3504:
What version of Hls.js are you using?
v1.0.0-beta.4
What browser and OS are you using?
Chrome on macOS
Test stream:
I can provide a test stream over Slack
Checklist
Steps to reproduce
Using the v1.0.0-beta.4 demo page, https://hls-js-0bd03ae0-14e6-4a69-a198-a0fa2cc343ea.netlify.app/demo/, my live stream fails to start playing maybe 1 out of 15 times or so. When it fails, it appears to get stuck in the audio stream controller and never recovers.
Expected behavior
Stream starts playing
Actual behavior
Stream never starts
Console output