Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Any of streams published via WebRTC, RTMP, MPEG-TS or captured from RTSP or RTMP source using REST API may be cut automatically to HLS segments. This feature may be enabled with the following parameter

Code Block
themeRDark
hls_auto_start=true

Since build 5.2.1895 it is possible to start HLS ABR stream automatically if HLS ABR on a single node is used. This feature may be enabled with the following parameter

Code Block
themeRDark
hls_abr_auto_start=true

HLS playback authentication using REST hook

...

  • id - subscriber identifier
  • ip - subscriber IP address
  • port -  subscriber source port
  • userAgent - User-Agent header sent by subscriber
  • active - subscriber is active
  • metrics - current subscriber metrics:
    • profileTime - the time the subscriber requested the profile shown by profile
    • requestsNumber - subscribers requests number
    • requestStatuses - response status codes count sent to the subscriber shown by response status code
    • profileSwitches - HLS ABR profile switches count for the subscriber
    • maxResponseTime - maximum response time
    • minResponseTime - minimum response time
    • avgResponseTime - average response time

HLS

...

For a streams with video track (video only or audio+video) WCS supports HLS ABR in CDN (a qualities are encoded on a dedicated Transcoder node) and on a single node.

Warning

HLS ABR does not work for audio only streams, WCS will return 404 Not found in response to HLS ABR manifest request for a such stream!

Legacy HLS ABR implementation in builds 5.2.484 - 5.2.582

Since build 5.2.484 HLS ABR playlists support was added. This feature can be enabled with the following parameter

Code Block
themeRDark
hls_master_playlist_enabled=true

Master playlist file name can be set using the following parameter

Code Block
themeRDark
hls_manifest_file=index.m3u8

Browser should get master playlist by URL

Code Block
themeRDark
https://wcs_address:8445/streamName/index.m3u8

Where

  • wcs_address - WCS server address
  • streamName - stream name
  • index.m3u8 - master playlist file name

When master playlist is requested for the stream, server checks if streams are published according to transcoding profiles listed in cdn_profiles.yml file, for example:

...

themeRDark

...

subscribers and connections displaying issues

In the response to the /hls/find_all, /hls/profiles, /hls/subscribers  queries a current HLS subscribers count and information are returned as per browser tabs. But HLS network connections count displaying at WCS statistics page

Code Block
languagebash
themeRDark
curl -s http://localhost:8081/?action=stat&params=connections_hls

may differ from HLS subscribers count. In the most cases, HLS subscribers use HTTP 2 protocol to connect and download a segments, then all the browser tabs receiving HLS streams from the same WCS server will use the same network connection.

In this case connections count displayed by connections_hls parameter is usually equal to HLS port connections count displayed by netstat command:

Code Block
languagebash
themeRDark
sudo netstat -np | grep ESTABLISHED | grep java | grep 8445

Where 8445 is HTTPS HLS port of WCS server

HLS ABR support

For a streams with video track (video only or audio+video) WCS supports HLS ABR in CDN (a qualities are encoded on a dedicated Transcoder node) and on a single node.

Warning

HLS ABR does not work for audio only streams, WCS will return 404 Not found in response to HLS ABR manifest request for a such stream!

Legacy HLS ABR implementation in builds 5.2.484 - 5.2.582

Since build 5.2.484 HLS ABR playlists support was added. This feature can be enabled with the following parameter

Code Block
themeRDark
hls_master_playlist_enabled=true

Master playlist file name can be set using the following parameter

Code Block
themeRDark
hls_manifest_file=index.m3u8

Browser should get master playlist by URL

Code Block
themeRDark
https://wcs_address:8445/streamName/index.m3u8

Where

  • wcs_address - WCS server address
  • streamName - stream name
  • index.m3u8 - master playlist file name

When master playlist is requested for the stream, server checks if streams are published according to transcoding profiles listed in cdn_profiles.yml file, for example:

Code Block
themeRDark
profiles:
  -720p:
    video:
      height: 720
      bitrate: 1000
      codec: h264
  -480p:
    video:
      height: 480
      bitrate: 1000
      codec: h264
  -240p:
    video:
      height: 240
      bitrate: 400
      codec: h264

...

In this case, HLS preloader and default transcoding must be disabled because a stream will be transcoded by defined profiles

Code Block
themeRDark
hls_preloader_enabled=false
hls_player_width=0
hls_player_height=0

FPS equalizing should also be enabled

Code Block
themeRDark
transcoder_align_encoders=true 
video_filter_enable_fps=true
video_filter_fps=30
video_filter_fps_gop_synchronization=60

HLS ABR transcoding quality profiles should be set in /usr/local/FlashphonerWebCallServer/conf/hls_abr_profiles.yml file

profiles: -180p: audio: codec : mpeg4-generic rate : 48000 video: height : 180 bitrate : 300 codec : h264 codecImpl : OPENH264 gop : 60 fps : 30 -240p: audio: codec : mpeg4-generic rate : 48000 video: height : 240 bitrate : 500
Code Block
languageyml
themeRDark
themeRDark
hls_preloader_enabled=false
hls_player_width=0
hls_player_height=0

FPS equalizing should also be enabled

Code Block
themeRDark
transcoder_align_encoders=true 
video_filter_enable_fps=true
video_filter_fps=30
video_filter_fps_gop_synchronization=60

HLS ABR transcoding quality profiles should be set in /usr/local/FlashphonerWebCallServer/conf/hls_abr_profiles.yml file

Code Block
languageyml
themeRDark
profiles:
  -180p:
    audio:
      codec : mpeg4-generic
      rate : 48000
    video:
      height : 180
      bitrate : 300
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30
 
  -240p:
    audio:
      codec : mpeg4-generic
      rate : 48000
    video:
      height : 240
      bitrate : 500
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30
 
  -480p:
    audio:
      codec : mpeg4-generic
      rate : 48000
    video:
      height : 480
      bitrate : 1000
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30
 
  -720p:
    audio:
      codec : mpeg4-generic
      rate : 48000
    video:
      height : 720
      bitrate : 1500
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

Low Latency HLS is also supported for HLS ABR

Code Block
themeRDark
hls_ll_enabled=true
hls_new_http_stack=true
Warning

When using HLS ABR on a single server, any published stream will be transcoded to a number of qualities. This requires a lot of server CPU cores and RAM.

Transcoding to higher resolutions prevention

Since build 5.2.1611, if a stream published has a less picture height than some profiles listed in hls_abr_profiles.yml, then all the variants with higher resolutions will not be encoded and will not be included to manfest. For example, the manifest will look as follows when original stream has  960x540 resolution:

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=300000,RESOLUTION=320x180,CODECS="avc1.42e01f,mp4a.40.2"
180/180.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=500000,RESOLUTION=428x240,CODECS="avc1.42e01f,mp4a.40.2"
240/240.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=848x480,CODECS="avc1.42e01f,mp4a.40.2"
480/480.m3u8

because there will not be upscale to 1280x720.

If the stream resolution is lower than a minimal profile, this stream will be transcoded to the minimal available profile, and the only variant will be included to manifest

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=300000,RESOLUTION=320x180,CODECS="avc1.42e01f,mp4a.40.2"
180/180.m3u8

If there is a profile without both width and height parameters, the stream will be transcoded to its original resolution with GOP and FPS defined in the profile, and this variant will always be included to manifest:

Code Block
themeRDark
profiles:
  original:
    video:
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

Qualities order in HLS ABR manifest

Before build 5.2.1606, HLS ABR manifest qualities are sorted in profile names alphabetical order, for example, such cdn_profiles.yml or hls_abr_profiles.yml 

Code Block
languageyml
themeRDark
profiles:
  360:
  -480p  video:
      height audio: 360
      codecbitrate : mpeg4-generic1000
      ratecodec : 48000h264
      codecImpl video: OPENH264
      heightgop : 48060
      bitratefps : 100030

  720:
    codec video: h264
      codecImplheight : OPENH264720
      gopbitrate : 602000
      fpscodec : 30h264
 
  -720p:
   codecImpl audio: OPENH264
      codecgop : mpeg4-generic60
      ratefps : 48000 30

  1080:
    video:
      height : 7201080
      bitrate : 15002500
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

Low Latency HLS is also supported for HLS ABR

Code Block
themeRDark
hls_ll_enabled=true
hls_new_http_stack=true
Warning

When using HLS ABR on a single server, any published stream will be transcoded to a number of qualities. This requires a lot of server CPU cores and RAM.

Transcoding to higher resolutions prevention

give the following manifest

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8

Since build 5.2.1611, if a stream published has a less picture height than some profiles listed in hls_abr_profiles.yml, then all the variants with higher resolutions will not be encoded and will not be included to manfest. For example, the manifest will look as follows when original stream has  960x540 resolution:1606, manifest qualities order equals to profiles order in cdn_profiles.yml or hls_abr_profiles.yml

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=3000001000000,RESOLUTION=320x180640x360,CODECS="avc1.42e01f,mp4a.40.2"
180360/180360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000002000000,RESOLUTION=428x2401280x720,CODECS="avc1.42e01f,mp4a.40.2"
240720/240720.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=10000002500000,RESOLUTION=848x4801920x1080,CODECS="avc1.42e01f,mp4a.40.2"
4801080/4801080.m3u8

because there will not be upscale to 1280x720.

If the stream resolution is lower than a minimal profile, this stream will be transcoded to the minimal available profile, and the only variant will be included to manifestIf there are two profiles with the same name in the setup, server will use only the last profile with the same name.

Force transcoding of a maximum ABR quality only if there are B-frames in a source stream

To reduce a server load while video encoding, since WCS build 5.2.1840 it is possible to transcode a maximum ABR quality (which is usually the original stream resolution and bitrate) only if there are B-frames in a source stream. The feature may be enabled by the following parameter

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=300000,RESOLUTION=320x180,CODECS="avc1.42e01f,mp4a.40.2"
180/180.m3u8

If there is a profile without both width and height parameters, the stream will be transcoded to its original resolution with GOP and FPS defined in the profile, and this variant will always be included to manifest:

Code Block
themeRDark
profiles:
  original:
    video:
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

Qualities order in HLS ABR manifest

Before build 5.2.1606, HLS ABR manifest qualities are sorted in profile names alphabetical order, for example, such cdn_profiles.yml or hls_abr_profiles.yml 

Code Block
languageyml
themeRDark
profiles:
  360:
    video:
      height : 360
      bitrate : 1000
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

  720:
    video:
      height : 720
      bitrate : 2000
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

  1080:
    video:
      height : 1080
      bitrate : 2500
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

give the following manifest

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8

...

h264_b_frames_force_transcoding=true

In this case the server will detect B-frames in a stream analizing a certain frames count (10 by default)

Code Block
themeRDark
frame_cnt_to_determine_their_type=10

If there are B-frames in the stream, the maximum ABR quality will be transcoded and will be available for playback in the HLS manifest

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8

If there are no B-frames in the stream, the maximum ABR quality will not be transcoded

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8

The original quality should be requested separately from a playing client.

Since build 5.2.1916, the feature is available for HLS ABR in CDN. To activate it, all the CDN servers should be updated to build 5.2.1916 or newer, and the following parameters should be set on Edge server

Code Block
themeRDark
cdn_strict_transcoding_boundaries=true
h264_b_frames_force_transcoding=true

Maximum playlist size

Maximum playlist size in segments is defined by the following parameter

Code Block
themeRDark
hls_list_size=8

By default, HLS playlist size is 8 segments. Note that HLS cut is just started, a segments quantity in the first playlists will be less than value set.

HLS segments storage

Using disk

In builds before 5.2.1713HLS segments are written to server hard drive to the /usr/local/FlashphonerWebCallServer/hls  folder by default. Starting from build 5.2.687, the folder for saving segments can be changed using the following parameter

Code Block
themeRDark
hls_dir=/usr/local/FlashphonerWebCallServer/hls

(Preloader folder is configured separately with parameter hls_preloader_dir.)

The number of stored segments corresponds to the specified playlist size. The less segments number, the less playback latency. However subscribers with poor channel could request HLS segments which are already gone from playlist and disk if playlist is short. To fix it, since build 5.2.581 the certain number of segments can be stored on disk after they gone from playlist. This feature can be enabled by the following parameter

Code Block
themeRDark
hls_hold_segments_before_delete=true

By default, 5 last segments will be stored

Code Block
themeRDark
hls_hold_segments_size=5

For example, if playlist contains 3 segments

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8

If there are two profiles with the same name in the setup, server will use only the last profile with the same name.

Maximum playlist size

Maximum playlist size in segments is defined by the following parameter

Code Block
themeRDark
hls_list_size=8

By default, HLS playlist size is 8 segments. Note that HLS cut is just started, a segments quantity in the first playlists will be less than value set.

HLS segments storage

Using disk

...

VERSION:8
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:15
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXTINF:3.415,
test_017.ts
#EXTINF:10.417,
test_018.ts
#EXTINF:9.084,
test_019.ts

3 current segments and 5 previous segments will be stored on disk

Code Block
themeRDark
test_012.ts
test_013.ts
test_014.ts
test_015.ts
test_016.ts
test_017.ts
test_018.ts
test_019.ts

Using memory

Under high load, for example on HLS streaming dedicated server, segments reading from hard drive to send them to subscribers can increase the latency. In this case, HLS segments storing in memory should be enabled

Code Block
themeRDark
hls_store_segment_in_memory=true

Segments will be read from memory to send them to subscribers. Note this will require more Java heap memory.

Since build 5.2.1713 HLS segments are stored in memory by default.

Debug logs for HLS session

For an error report, debug logging can be enabled for HLS sessions using CLI

Code Block
languagebash
themeRDark
update node-setting --value true hls_enable_session_debug

Note that config flashphoner.properties will be overwritten after the command.

Low Latency HLS support

Since WCS build 5.2.1181, Low Latency HLS (LL HLS) is supported. The feature may be enabled with the following parameters

Code Block
themeRDark
hls_ll_dir=/usr/local/FlashphonerWebCallServer/hls

(Preloader folder is configured separately with parameter hls_preloader_dir.)

...

enabled=true
hls_new_http_stack=true

In this case, players supporting LL HLS (HLS.JS for example) will play additional HLS segments reducing playback latency comparing with players which do not play those segments (VideoJS for example).

It is necessary to provide a stable FPS and keyframe interval for a published stream to play it as LL HLS correctly. Therefore, it is recommended to publish the source strem as RTMP with the following example parameters

Image Added

Image Added

Recommended settings for LL HLS playback

Since build 5.2.1345, the recommended settings to play Low latency HLS are follow:

Code Block
themeRDark
hls_ll_enabled=true
hls_hold_segments_before_delete=true

...

_auto_start=true
hls_preloader_enabled=false
hls_player_width=848
hls_player_height=480
video_filter_enable_fps=true
video_filter_fps=30
video_encoder_h264_gop=60

Using HTTP/2 and HTTP/1

According to specification, LL HLS must be played using HTTP/2, i.e. via secure connection

Code Block
themeRDark
hls_hold_segments_size=5

...

https://wsc:8445/test/test.m3u8

It is also possible to use HTTP/1 via unsecure connection with WCS

Code Block
themeRDark
#EXTM3U
#EXT-X-VERSION:8
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:15
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXTINF:3.415,
test_017.ts
#EXTINF:10.417,
test_018.ts
#EXTINF:9.084,
test_019.ts

...

http://wsc:8082/test/test.m3u8

Note that LL HLS via HTTP/1 works in main browsers except Safari, and this feature is not recommended to use in production.

LL HLS segments folder

By default, LL HLS segments are written to streams subdolder to the folder

Code Block
themeRDark
test_012.ts
test_013.ts
test_014.ts
test_015.ts
test_016.ts
test_017.ts
test_018.ts
test_019.ts

Using memory

...

ll_hls_dir=/usr/local/FlashphonerWebCallServer/ll-hls

If folder has changed

Code Block
themeRDark
ll_hls_store_segment_in_memory=true

Segments will be read from memory to send them to subscribers. Note this will require more Java heap memory.

Since build 5.2.1713 HLS segments are stored in memory by default.

Debug logs for HLS session

...

dir=/opt/ll-hls

it is necessary to set file access permissions using the command

Code Block
languagebash
themeRDark
update node-setting --value true hls_enable_session_debug

Note that config flashphoner.properties will be overwritten after the command.

Low Latency HLS support

...

/usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions

and restart WCS to apply the changes.

Maximum LL HLS playlist size

Maximum LL HLS playlist size in segments is defined by the following parameter

Code Block
themeRDark
hls_ll_enabled=true
hls_newlist_http_stacksize=true

In this case, players supporting LL HLS (HLS.JS for example) will play additional HLS segments reducing playback latency comparing with players which do not play those segments (VideoJS for example).

It is necessary to provide a stable FPS and keyframe interval for a published stream to play it as LL HLS correctly. Therefore, it is recommended to publish the source strem as RTMP with the following example parameters

Image Removed

Image Removed

...

12

By default, LL HLS playlist size is 12 full segments. Note that LL HLS cut is just started, a full segments quantity in the first playlists will be less than value set.

LL HLS preloader

Since build 5.2.1345, the recommended settings to play Low latency HLS are follow:1729, a special preloader can be used for LL HLS as like as usual HLS

Code Block
themeRDark
hls_llpreloader_enabled=true
hls_auto_start=true
hls_preloader_enabled=false
hls_player_width=848
hls_player_height=480
video_filter_enable_fps=true
video_filter_fps=30
video_encoder_h264_gop=60

Using HTTP/2 and HTTP/1

...

LL HLS preloader files are placed by default to the folder

Code Block
themeRDark
ll_hls_preloader_dir=/usr/local/FlashphonerWebCallServer/ll-hls/.preloader

The folder can be changed, for example

Code Block
themeRDark
ll_hls_preloader_dir=/opt/preloader

Default LL HLS preloader consists of the following files, one per each standard video streams aspect ratio

Code Block
themeRDark
https://wsc:8445/test/test.m3u8

It is also possible to use HTTP/1 via unsecure connection with WCS

16x9.mp4
2x1.mp4
4x3.mp4

If stream aspect ration is unknown, 16:9 preloader file will be used. If there are no preloader files at all, LL HLS stream cut will start without a preloader like

Code Block
themeRDark
http://wsc:8082/test/test.m3u8

Note that LL HLS via HTTP/1 works in main browsers except Safari, and this feature is not recommended to use in production.

LL HLS segments folder

By default, LL HLS segments are written to streams subdolder to the folder

Code Block
themeRDark
ll_hls_dir=/usr/local/FlashphonerWebCallServer/ll-hls

If folder has changed

Code Block
themeRDark
ll_hls_dir=/opt/ll-hls

...

hls_preloader_enabled=false

Custom LL HLS preloader setup

A custom LL HLS preloader can be set up if necessary. The media files in three standard aspects 16:9, 4:3 и 2:1 should be prepared according to the following requirements:

  • MP4 container, video codec H264, audio codec AAC
  • the files should allow instant playback (MP4 moov atom must precede mdat one)
  • the files should not containt B frames
  • the file duration should be near 1 minute
  • the file should have a smooth FPS
  • keyframe interval should be near 2 seconds

Suppose a source files are prepared in a proper aspects in OBS Studio or in a video editor. Use the following command example to convert a preloader files to conform the requirements above:

Code Block
languagebash
themeRDark
/usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions

and restart WCS to apply the changes.

Maximum LL HLS playlist size

Maximum LL HLS playlist size in segments is defined by the following parameter

Code Block
themeRDark
ll_hls_list_size=12

By default, LL HLS playlist size is 12 full segments. Note that LL HLS cut is just started, a full segments quantity in the first playlists will be less than value set.

LL HLS preloader

Since build 5.2.1729, a special preloader can be used for LL HLS as like as usual HLS

Code Block
themeRDark
hls_preloader_enabled=true

LL HLS preloader files are placed by default to the folder

Code Block
themeRDark
ll_hls_preloader_dir=/usr/local/FlashphonerWebCallServer/ll-hls/.preloader

...

ffmpeg -i 16x9-source.mp4 -bf 0 -acodec aac -vcodec h264 -preset ultrafast -g 60 -strict -2 -r 30 -ar 48000 -movflags faststart -ss 00:00:00 -t 00:01:00 16x9.mp4

Then the default preloader files should be replaced by custom preloader files, and WCS should be restarted.

To restore default preloader it is enough to remove custom preloader files and restart WCS.

m4s container support

Since build 5.2.1626 m4s container is supported for HLS segments cut, and since build 5.2.1632 the container is enabled by default for HLS ABR too

Code Block
themeRDark
ll_hls_preloaderfragmented_dir=/opt/preloader

Default LL HLS preloader consists of the following files, one per each standard video streams aspect ratio

Code Block
themeRDark
16x9.mp4
2x1.mp4
4x3.mp4

...

mp4=true

Since build 5.2.1724, m4s container is supported for HLS ABR in CDN.

You can switch back to the ts container if necessary

Code Block
themeRDark
ll_hls_preloaderfragmented_enabledmp4=false

Custom LL HLS preloader setup

A custom LL HLS preloader can be set up if necessary. The media files in three standard aspects 16:9, 4:3 и 2:1 should be prepared according to the following requirements:

  • MP4 container, video codec H264, audio codec AAC
  • the files should allow instant playback (MP4 moov atom must precede mdat one)
  • the files should not containt B frames
  • the file duration should be near 1 minute
  • the file should have a smooth FPS
  • keyframe interval should be near 2 seconds

Suppose a source files are prepared in a proper aspects in OBS Studio or in a video editor. Use the following command example to convert a preloader files to conform the requirements above:

Code Block
languagebash
themeRDark
ffmpeg -i 16x9-source.mp4 -bf 0 -acodec aac -vcodec h264 -preset ultrafast -g 60 -strict -2 -r 30 -ar 48000 -movflags faststart -ss 00:00:00 -t 00:01:00 16x9.mp4

Then the default preloader files should be replaced by custom preloader files, and WCS should be restarted.

To restore default preloader it is enough to remove custom preloader files and restart WCS.

m4s container support

Since build 5.2.1626 m4s container is supported for HLS segments cut, and since build 5.2.1632 the container is enabled by default for HLS ABR too

Code Block
themeRDark
ll_hls_fragmented_mp4=true

Since build 5.2.1724, m4s container is supported for HLS ABR in CDN.

You can switch back to the ts container if necessary

Code Block
themeRDark
ll_hls_fragmented_mp4=false

Using a common network stack for HLS and Low Latency HLS

Since build 5.2.1749 the parameter allowing an unified network stack usage both for HLS and Low latency HLS is added. The parameter is enabled by default:

Code Block
themeRDark
use_new_hls=true

In this case:

...

Using a common network stack for HLS and Low Latency HLS

Since build 5.2.1749 the parameter allowing an unified network stack usage both for HLS and Low latency HLS is added. The parameter is enabled by default:

Code Block
themeRDark
use_new_hls=true

In this case:

  • m4s container is used by default to record an HLS segments
  • parameters with hls prefix are applied both to HLS and LL HLS
  • parameters with ll_hls prefox are applied to LL HLS and to m4s container
Warning

Since build 5.2.1793, the parameter is removed. The unified network stack is always used to deliver both HLS and LL HLS segments.

Manifest URL setup

Since build 5.2.1852, an URL templates to request a stream main playlist (manifest) may be customized. By default, the following templates are used:

Code Block
themeRDark
hls_path_template={streamName}/{streamName}.m3u8
hls_abr_path_template={streamName}{abrSuffix}/{streamName}{abrSuffix}.m3u8

Where:

  • streamName - stream published name
  • abrSuffix - HLS ABR stream suffix set by hls_abr_stream_name_suffix parameter

In this case, the following URLs should be used to get HLS manifest

Code Block
themeRDark
https://wcs:8445/stream/stream.m3u8

and to get HLS ABR manifest

Code Block
themeRDark
https://wcs:8445/stream-HLS-ABR-STREAM/stream-HLS-ABR-STREAM.m3u8

For example, if a fixed manifest name different for HLS ABR and non-ABR streams is preferred to use, then the following templates should be set

Code Block
themeRDark
hls_path_template={streamName}/playlist.m3u8
hls_abr_path_template={streamName}/playlist{abrSuffix}.m3u8

In this case, the following URLs should be used to get HLS manifest

Code Block
themeRDark
https://wcs:8445/stream/playlist.m3u8

and to get HLS ABR manifest

Code Block
themeRDark
https://wcs:8445/stream/playlist-HLS-ABR-STREAM.m3u8

Known issues

1. Non-recoverable freeze of HLS stream played in iOS Safari through a CDN

...

Solution: since build 5.2.1690, use m4s container for audio only streams

13. Encoder resources leak may appear under a high load when using HLS ABR

Symptoms: when HLS ABR is used and server CPU load is high (for instance, an encoding profiles number for all the streams published exceeds CPU capabilities), encoding resources may not be freed after publishing is stopped, and this may be visible on server statistics page, for example

Code Block
themeRDark
streams_hls=0
...
native_resources.video_encoders=5

Solution: update WCS to build 5.2.1947 and set the following parameter

Code Block
themeRDark
handler_async_disconnect=false