Closed getroot closed 1 year ago
Hey @getroot! This is working excellent in Chrome on Mac (using OvenPlayer, TheoPlayer Demo, and my own HLS.js-based player), but I'm running into some issues in Native Safari. I've set up a simple page to test
<html>
<head></head>
<body>
<video width="100%" height="100%" autoplay controls muted loop src="https://cdn.organization.tld/edge/live/llhls.m3u8"></video>
<body>
</html>
Trying on iOS or on a Mac is showing the same results (this one is iOS):
And on the mac:
What information can I provide to help test?
@cwpenhale
Please give me as much information as possible so I can clone your environment to reproduce the problem.
Your Server.xml (specifically Origin's OutputProfile), and log files, chunklist_x_video.llhls.m3u8 files, and the encoder information and codec settings you use.
Also check that the OME you are using is the latest version of the master branch.
Thank you!
It would be helpful if you also share the contents of the llhls.m3u8 file.
Alternatively, it is a good way to share the results obtained by running the mediastreamvalidator(https://developer.apple.com/documentation/http_live_streaming/using_apple_s_http_live_streaming_hls_tools) provided by Apple.
Here's the Apple report: report.html.zip
Here's OBS:
Here's the configs: https://gist.github.com/cwpenhale/dc9fba90359a8f4585c8008ea67b5a84
Here's a HAR containing the initial HTTP/2 Conversation: ios.com.har.zip
In case you are unfamiliar with HAR, there is a viewer here: http://www.softwareishard.com/har/viewer/
In case you do not want to bother with the HAR, here is the llhls.m3u8
you requested (from the HAR):
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="4",NAME="none",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="2",URI="chunklist_4_audio_llhls
.m3u8?session=8_eEU6kN3g"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="5",NAME="none",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="2",URI="chunklist_5_audio_llhls
.m3u8?session=8_eEU6kN3g"
#EXT-X-STREAM-INF:BANDWIDTH=10160000,RESOLUTION=3840x2160,FRAME-RATE=30.0,CODECS="avc1.42c033,mp4a.40
.2",AUDIO="4"
chunklist_0_video_llhls.m3u8?session=8_eEU6kN3g
#EXT-X-STREAM-INF:BANDWIDTH=8160000,RESOLUTION=1920x1080,FRAME-RATE=24.0,CODECS="avc1.42c028,mp4a.40
.2",AUDIO="4"
chunklist_1_video_llhls.m3u8?session=8_eEU6kN3g
#EXT-X-STREAM-INF:BANDWIDTH=5064000,RESOLUTION=1280x720,FRAME-RATE=24.0,CODECS="avc1.42c01f,mp4a.40.2"
,AUDIO="5"
chunklist_2_video_llhls.m3u8?session=8_eEU6kN3g
/edge/live/chunklist_0_video_llhls.m3u8?session=8_eEU6kN3g
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=0.6
#EXT-X-VERSION:9
#EXT-X-PART-INF:PART-TARGET=0.200000
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-MAP:URI="init_0_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:10:39.478+00:00
#EXTINF:6.400,
seg_0_0_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:10:45.911+00:00
#EXTINF:6.000,
seg_0_1_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:10:51.911+00:00
#EXTINF:6.000,
seg_0_2_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:10:57.911+00:00
#EXTINF:6.000,
seg_0_3_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:11:03.911+00:00
#EXTINF:6.000,
seg_0_4_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:11:09.911+00:00
#EXTINF:6.000,
seg_0_5_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:11:15.911+00:00
#EXTINF:6.000,
seg_0_6_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:11:21.911+00:00
#EXT-X-PART:DURATION=0.200,URI="part_0_7_0_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT=
YES
#EXT-X-PART:DURATION=0.200,URI="part_0_7_1_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_2_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_3_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_4_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_5_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT=
YES
#EXT-X-PART:DURATION=0.200,URI="part_0_7_6_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_7_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_8_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_9_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_10_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_7_11_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_12_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_13_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_14_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_15_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_7_16_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_17_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_18_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_19_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_20_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_7_21_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_22_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_23_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_24_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_25_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_7_26_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_27_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_28_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_7_29_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXTINF:6.000,
seg_0_7_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:11:27.911+00:00
#EXT-X-PART:DURATION=0.200,URI="part_0_8_0_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT=
YES
#EXT-X-PART:DURATION=0.200,URI="part_0_8_1_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_2_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_3_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_4_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_5_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT=
YES
#EXT-X-PART:DURATION=0.200,URI="part_0_8_6_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_7_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_8_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_9_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_10_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_8_11_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_12_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_13_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_14_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_15_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_8_16_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_17_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_18_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_19_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_20_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_8_21_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_22_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_23_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_24_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_25_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT
=YES
#EXT-X-PART:DURATION=0.200,URI="part_0_8_26_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_27_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_28_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_8_29_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXTINF:6.000,
seg_0_8_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g
#EXT-X-PROGRAM-DATE-TIME:2022-05-28T22:11:33.911+00:00
#EXT-X-PART:DURATION=0.200,URI="part_0_9_0_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g",INDEPENDENT=
YES
#EXT-X-PART:DURATION=0.200,URI="part_0_9_1_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_9_2_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_9_3_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PART:DURATION=0.200,URI="part_0_9_4_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="part_0_9_5_video_DOmTFv8a_llhls.m4s?session=8_eEU6kN3g"
#EXT-X-RENDITION-REPORT:URI="chunklist_1_video_llhls.m3u8?session=8_eEU6kN3g",LAST-MSN=9,LAST-PART=6
#EXT-X-RENDITION-REPORT:URI="chunklist_2_video_llhls.m3u8?session=8_eEU6kN3g",LAST-MSN=9,LAST-PART=6
#EXT-X-RENDITION-REPORT:URI="chunklist_4_audio_llhls.m3u8?session=8_eEU6kN3g",LAST-MSN=9,LAST-PART=8
#EXT-X-RENDITION-REPORT:URI="chunklist_5_audio_llhls.m3u8?session=8_eEU6kN3g",LAST-MSN=9,LAST-PART=8
Hope this helps!
I am pulling the most recent docker image before all of my tests, as well! This test was run against
docker inspect ome-edge
snippet
"Image": "fdb218b32cc7e2ce87661a268f8f795848061cd001fd91f8b276446876faba8f",
"ImageName": "docker.io/airensoft/ovenmediaengine:dev",
@cwpenhale Thank you! This is the best report! I'll reproduce the problem and kill that!
I couldn't reproduce your problem, but the information you provided helped me to pinpoint the problem.
I have patched the code that may be causing this problem. Could you please check if the latest master branch solves your problem?
And as a tip, your Relay Server and Edge Server can omit <OutputProfiles>
in Server.xml. This is because OVT uses information received from Origin. Even now, your Relay and Edge do not use the <OutputProfiles>
you set, but use the information received from Origin.
@getroot you did it! Working in Mac Safari and iOS. Let me know if there's any output I can provide that will help with continued development.
Did anyone already do tests with this over long distance / high delay / medium packet loss links, to see if things like bitrate choice flapping or similar does occur?
Did anyone already do tests with this over long distance / high delay / medium packet loss links, to see if things like bitrate choice flapping or similar does occur?
You can use NetworkLinkConditioner (Mac) or Clumsy-0.2.exe (Win) or NetLimiter (30 day free trial) to induce packet loss or speed throttling to test this feature.
Hello How can I edit the list of options in the list when using ABR? Like in the picture , to make them more meaningful.
Thank you.
Current not - the label is generates here: https://github.com/AirenSoft/OvenPlayer/blob/bd22e3407e4afe299f7cb6c6dcb8f4ff70eb4e36/src/js/api/provider/html5/providers/Hls.js#L103
Maybe you should create an issue there (OvenPlayer) to create an custome label generator function there.
@genofire)
Thank you.
While theoplayer is able to jump from 360p to 540, and then 720p and 1080p, ovenplayer stuck at 360p for me and it falls down to 360p easily if I choose auto. My internet is pretty decent (Theoplayer is a proof of that)
<OutputProfiles>
<!-- Enable this configuration if you want to hardware acceleration using GPU -->
<HardwareAcceleration>false</HardwareAcceleration>
<OutputProfile>
<Name>bypass_stream</Name>
<OutputStreamName>${OriginStreamName}</OutputStreamName>
<Renditions>
<Rendition><Name>Bypass</Name><Video>bypass_video</Video><Audio>bypass_audio</Audio></Rendition>
<!-- <Rendition><Name>FHD</Name><Video>video_1080</Video><Audio>bypass_audio</Audio></Rendition> -->
<Rendition><Name>HD</Name><Video>video_720</Video><Audio>bypass_audio</Audio></Rendition>
<Rendition><Name>HD-</Name><Video>video_540</Video><Audio>bypass_audio</Audio></Rendition>
<Rendition><Name>SD</Name><Video>video_360</Video><Audio>bypass_audio</Audio></Rendition>
</Renditions>
<Encodes>
<Audio>
<Name>bypass_audio</Name>
<Bypass>true</Bypass>
</Audio>
<Video>
<Name>bypass_video</Name>
<Bypass>true</Bypass>
</Video>
<Audio>
<Codec>opus</Codec>
<Bitrate>128000</Bitrate>
<Samplerate>48000</Samplerate>
<Channel>2</Channel>
</Audio>
<!-- <Video><Name>video_1080</Name><Codec>h264</Codec><Bitrate>5000000</Bitrate><Framerate>30</Framerate><Width>1920</Width><Height>1080</Height><Preset>faster</Preset></Video> -->
<Video><Name>video_720</Name><Codec>h264</Codec><Bitrate>2000000</Bitrate><Framerate>30</Framerate><Width>1280</Width><Height>720</Height><Preset>faster</Preset></Video>
<Video><Name>video_540</Name><Codec>h264</Codec><Bitrate>1200000</Bitrate><Framerate>30</Framerate><Width>960</Width><Height>540</Height><Preset>faster</Preset></Video>
<Video><Name>video_360</Name><Codec>h264</Codec><Bitrate>550000</Bitrate><Framerate>30</Framerate><Width>640</Width><Height>360</Height><Preset>faster</Preset></Video>
</Encodes>
</OutputProfile>
</OutputProfiles>
@mpisat This is the difference in the algorithm for measuring network performance on the player side. In my opinion THEOPlayer is better than hls.js for this algorithm. I'm looking for ways to improve this in hls.js.
Also, since hls.js does not yet use LLHLS's PRELOAD-HINT, it is a good choice to use THEO for commercial services.
Thanks for the details @getroot
The settings for ABR have been changed and committed to the master branch today.
Existing <Renditions>
was not scalable because only one could exist. This was a very difficult structure to use in future WebRTC ABR. So, the existing <Renditions>
has been changed to <Playlist>
, and there can be multiple playlists and each can be accessed through <FileName>
.
Here is an example configuration:
<!--LLHLS URL : https://domain/app/stream/abr.m3u8 -->
<Playlist>
<Name>For LLHLS</Name>
<FileName>abr</FileName>
<Rendition>
<Name>Bypass</Name>
<Video>bypass_video</Video>
<Audio>bypass_audio</Audio>
</Rendition>
<Rendition>
<Name>FHD</Name>
<Video>video_1280</Video>
<Audio>bypass_audio</Audio>
</Rendition>
<Rendition>
<Name>HD</Name>
<Video>video_720</Video>
<Audio>bypass_audio</Audio>
</Rendition>
</Playlist>
<!--LLHLS URL : https://domain/app/stream/llhls.m3u8 -->
<Playlist>
<Name>Change Default</Name>
<FileName>llhls</FileName>
<Rendition>
<Name>HD</Name>
<Video>video_720</Video>
<Audio>bypass_audio</Audio>
</Rendition>
</Playlist>
In LLHLS, you can play a playlist with http[s]://<domain>[:port]/<app>/<stream>/<FileName>.m3u8
One restriction is that playlist and chunklist keywords MUST NOT be included in <FileName>
. This is a reserved word used by the server.
Please refer to the manual below. https://airensoft.gitbook.io/ovenmediaengine/v/master-1/transcoding#adaptive-bitrates-streaming-abr
New/current config contains invalid example:
<Playlist><Rendition><Video>
is not equal to <Encodes><Video><Name>
480p
exists (it whould good to know which Width and Bitrate 480p has - e.g. Width: 848 or 854)
Added ABR feature for LLHLS in latest master branch.
You can use ABR by adding
<Renditions>
to your OutputProfile like this:Add
<Name>
to the<Encodes>
element you want to link to the<Rendition>
If there is no<Renditions>
, the first supported video track and audio track among Encodes will be used as before.I will start working on adding
<Renditions>
to WebRTC soon. But it will take a long time because this is a very big job. I hope to roll out the WebRTC ABR feature soon.Many thanks for the feedback.