Flashls
flashls is an Open-source HLS Flash plugin that allows you to playback HLS streams.
This plugin is easily pluggable in any Flash Player thanks to its simple API (NetStream based) and it is also compatible and already plugged with the following players:
- Flowplayer 3.2.12
- OSMF 2.0 based players (such as Strobe Media Playback and GrindPlayer)
- Video.js
- MediaElement.js
- Clappr - a very easy open source player to use and to extend.
HLS Features supported
- VoD & Live playlists
- Sliding window (aka DVR) support on Live playlists
- Adaptive streaming
- Manual & Auto switching
- Serial segment fetching method from https://www.cs.tut.fi/~moncef/publications/rate-adaptation-IC-2011.pdf
- Alternate Audio Track Rendition
- Master Playlist with alternative Audio
- Configurable seeking method on VoD & Live
- Accurate seeking to exact requested position
- Key frame based seeking (nearest key frame)
- Segment based seeking (beginning of segment)
- AES-128 decryption
- Buffer progress report
- Error resilience
- Retry mechanism on I/O errors
- Recovery mechanism on badly segmented TS streams
Supported M3U8 tags
#EXTM3U#EXTINF-
#EXT-X-STREAM-INF(Multiple bitrate) -
#EXT-X-ENDLIST(VoD / Live playlist) #EXT-X-MEDIA-SEQUENCE#EXT-X-TARGETDURATION#EXT-X-DISCONTINUITY#EXT-X-DISCONTINUITY-SEQUENCE-
#EXT-X-PROGRAM-DATE-TIME(optional, used to synchronize time-stamps and sequence number when switching from one level to another) -
#EXT-X-KEY(AES-128 method supported only) #EXT-X-BYTERANGE
Examples :
- https://www.flashls.org/latest/examples/chromeless
- https://www.flashls.org/latest/examples/osmf/GrindPlayer.html
- https://www.flashls.org/latest/examples/osmf/StrobeMediaPlayback.html
- https://www.flashls.org/latest/examples/flowplayer/index.html
- https://www.flashls.org/mediaelement/demo/mediaelementplayer-hls.html
- https://www.flashls.org/videojs/flash_demo.html
Usage
- Download flashls from https://github.com/mangui/flashls/releases
- Unzip, extract and upload the appropriate version to your server
- In the
examplesdirectory you will find examples for ChromelessPlayer, Flowplayer, Strobe Media Playback (SMP) and GrindPlayer
Configuration
The plugin accepts several optional configuration options, such as:
-
hls_debug(default false) - Toggle debug traces, outputted on JS console -
hls_debug2(default false) - Toggle verbose debug traces, outputted on JS console -
hls_minbufferlength(default -1) - Minimum buffer length in seconds that needs to be reached before playback can start (after seeking) or restart (in case of empty buffer)- If set to
-1some heuristics based on past metrics are used to define an accurate value that should prevent buffer to stall
- If set to
-
hls_lowbufferlength(default 3) - Low buffer threshold in seconds. When crossing down this threshold, HLS will switch to buffering state, usually the player will report this buffering state through a rotating icon. Playback will still continue. -
hls_maxbufferlength(default 60) - Maximum buffer length in seconds (0 means infinite buffering) -
hls_startfromlevel(default -1)- from 0 to 1 : indicates the "normalized" preferred bitrate. As such,
- if 0, lowest non-audio bitrate is used,
- if 1, highest bitrate is used,
- if 0.5, the closest to the middle bitrate will be selected and used first.
- -1 : automatic start level selection, playback will start from level matching download bandwidth (determined from download of first segment)
- from 0 to 1 : indicates the "normalized" preferred bitrate. As such,
-
hls_seekfromlevel(default -1) - If set to true, playback will start from lowest non-audio level after any seek operation. If set to false, playback will start from level used before seeking- from 0 to 1 : indicates the "normalized" preferred bitrate. As such,
- if 0, lowest non-audio bitrate is used,
- if 1, highest bitrate is used,
- if 0.5, the closest to the middle bitrate will be selected and used first.
- -1 : automatic seek level selection, keep level before seek.
- from 0 to 1 : indicates the "normalized" preferred bitrate. As such,
-
hls_live_flushurlcache(default false) - If set to true, Live playlist will be flushed from URL cache before reloading (this is to workaround some cache issues with some combination of Flash Player / IE version) -
hls_seekmode- "ACCURATE" - Seek to exact position
- "KEYFRAME" - Seek to last keyframe before requested position
- "SEGMENT" - Seek to beginning of segment containing requested position
-
hls_manifestloadmaxretry(default -1): max number of Manifest load retries after I/O Error.- if any I/O error is met during initial Manifest load, it will not be reloaded. an HLSError will be triggered immediately.
- After initial load, any I/O error will trigger retries every 1s,2s,4s,8s (exponential, capped to 64s). please note specific handling for these 2 values :
- 0, means no retry, error message will be triggered automatically
- -1 means infinite retry
-
hls_fragmentloadmaxretry(default -1): max number of Fragment load retries after I/O Error.- any I/O error will trigger retries every 1s,2s,4s,8s (exponential, capped to 64s). please note specific handling for these 2 values :
- 0, means no retry, error message will be triggered automatically
- -1 means infinite retry
- any I/O error will trigger retries every 1s,2s,4s,8s (exponential, capped to 64s). please note specific handling for these 2 values :
-
hls_capleveltostage(default false) : limit levels usable in auto-quality by the stage dimensions (width and height)- true : level width and height (defined in m3u8 playlist) will be compared with the player width and height (stage.stageWidth and stage.stageHeight). Max level will be set depending on the
hls_maxlevelcappingmodeoption. Note: this setting is ignored in manual mode so all the levels could be selected manually. - false : levels will not be limited. All available levels could be used in auto-quality mode taking only bandwidth into consideration.
- true : level width and height (defined in m3u8 playlist) will be compared with the player width and height (stage.stageWidth and stage.stageHeight). Max level will be set depending on the
-
hls_maxlevelcappingmode(default downscale) : defines the max level capping mode to the one available in HLSMaxLevelCappingMode:- "downscale" - max capped level should be the one with the dimensions equal or greater than the stage dimensions (so the video will be downscaled)
- "upscale" - max capped level should be the one with the dimensions equal or lower than the stage dimensions (so the video will be upscaled)
Setup
Flowplayer
flowplayer("player", 'https://releases.flowplayer.org/swf/flowplayer-3.2.12.swf', {
// Flowplayer configuration options
// ...
plugins: {
httpstreaming: {
// flashls configuration options
url: 'flashlsFlowPlayer.swf',
hls_debug: false,
hls_debug2: false,
hls_lowbufferlength: 3,
hls_minbufferlength: 8,
hls_maxbufferlength: 60,
hls_startfromlowestlevel: false,
hls_seekfromlowestlevel: false,
hls_live_flushurlcache: false,
hls_seekmode: 'ACCURATE',
hls_capleveltostage: false,
hls_maxlevelcappingmode: 'downscale'
}
}
});
Strobe Media Playback (SMP) and other OSMF based players
var playerOptions = {
// Strobe Media Playback configuration options
// ...
source: 'https://example.com/stream.m3u8',
// flashls configuration options
plugin_hls: "flashlsOSMF.swf",
hls_debug: false,
hls_debug2: false,
hls_minbufferlength: -1,
hls_lowbufferlength: 2,
hls_maxbufferlength: 60,
hls_startfromlowestlevel: false,
hls_seekfromlowestlevel: false,
hls_live_flushurlcache: false,
hls_seekmode: 'ACCURATE',
hls_capleveltostage: false,
hls_maxlevelcappingmode: 'downscale'
};
swfobject.embedSWF('StrobeMediaPlayback.swf', 'player', 640, 360, '10.2', null, playerOptions, {
allowFullScreen: true,
allowScriptAccess: 'always',
bgColor: '#000000',
wmode: 'opaque'
}, {
name: 'player'
});
License
Donation
flowplayer("player", 'https://releases.flowplayer.org/swf/flowplayer-3.2.12.swf', {
// Flowplayer configuration options
// ...
plugins: {
httpstreaming: {
// flashls configuration options
url: 'flashlsFlowPlayer.swf',
hls_debug: false,
hls_debug2: false,
hls_lowbufferlength: 3,
hls_minbufferlength: 8,
hls_maxbufferlength: 60,
hls_startfromlowestlevel: false,
hls_seekfromlowestlevel: false,
hls_live_flushurlcache: false,
hls_seekmode: 'ACCURATE',
hls_capleveltostage: false,
hls_maxlevelcappingmode: 'downscale'
}
}
});
var playerOptions = {
// Strobe Media Playback configuration options
// ...
source: 'https://example.com/stream.m3u8',
// flashls configuration options
plugin_hls: "flashlsOSMF.swf",
hls_debug: false,
hls_debug2: false,
hls_minbufferlength: -1,
hls_lowbufferlength: 2,
hls_maxbufferlength: 60,
hls_startfromlowestlevel: false,
hls_seekfromlowestlevel: false,
hls_live_flushurlcache: false,
hls_seekmode: 'ACCURATE',
hls_capleveltostage: false,
hls_maxlevelcappingmode: 'downscale'
};
swfobject.embedSWF('StrobeMediaPlayback.swf', 'player', 640, 360, '10.2', null, playerOptions, {
allowFullScreen: true,
allowScriptAccess: 'always',
bgColor: '#000000',
wmode: 'opaque'
}, {
name: 'player'
});
If you'd like to support future development and new product features, please make a donation via PayPal. These donations are used to cover my ongoing expenses - web hosting, domain registrations, and software and hardware purchases.
