Hi all
I apologise in advance for the long post.
We are using v5.8.2011 (licenced), with rtmp streaming from Amazon Cloudfront. We embed, create playlists and set up levels with the Javascript API.
A playlist contains maybe 5-10 .mp4 files, maybe 20 seconds each, with 7 quality levels for each file ranging from 40kb/s to 3mb/s.
My questions are:
1) When creating the levels, does it make a difference whether we put the highest quality first or last?
This page suggests putting the best first...
http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/12535/video-delivery-rtmp-stre...
This page has examples putting the lowest first...
http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/15995/jw-embedder-reference-gu...
2) Is it possible to force dynamic streaming to only switch towards the lower quality levels, i.e once it has failed at a level to never go back up there?
3) If not, is it possible to override the default blacklist time so that we can make it so long that effectively the higher levels don't come back into play?
4) Is there a way to carry forward the Level between one playlist item and the next?
5) If these are not possible, could they be added as feature request? Or is it something that can only be done server side?
6) I've seen in ticket #1020 you refer to a proposed setLevel() method which "initiates a bitrate switch to the assigned level" where "the player will remain at the given bitrate level for the remainder of the video playback session". Would it be possible to create a setMaximumLevel(level:Number,scope:String), which would set the Maximum allowed level and could be set to apply either to only the current playlist item or to the whole playlist? With the other proposals in that ticket we could then do something like:
onLevel(setMaximumLevel(getCurrentLevel(),'playlist')) or onLevel(setMaximumLevel(getCurrentLevel(),'item'))
The reason for wanting to do these is to gain from Dynamic Streaming's ability to assess system performance through measuring the dropped frames.
With the increasing use of smartphones and laptops vs desktops we are concerned that although people may have sufficient bandwidth, increasingly it is the system (CPU/RAM whatever) performance that is the bottleneck.
It seems that Dynamic Streaming is prioritising the measurement of bandwidth over dropped frames. We are seeing that when a user has sufficient bandwidth, but has been switched down levels due to frames being dropped, as soon as the higher levels get un-blacklisted, he is switched back up again. This puts him in a constant loop of of jerky video while dropping down levels one at a time, then being put back to the highest levels.
Also it seems that on changing a playlist item, a brand new assessment is made, again causing him to start back at the higher quality levels again.
We think it would be better that if switch is made down a quality level due to dropped frames rather than bandwidth, then it should not be allowed to switch back up as realistically whereas bandwidth can fluctuate significantly over a video session, system performance is unlikely to vary significantly.
We would prefer to have a situation where these users get to a point where playback is smooth. We accept thought that there is a negative effect, where users that DO have sufficient CPU and whose bandwidth improves during playback, won't get moved to the higher quality levels.
To us, this is preferable to the current situation where people with low powerered systems can suffer from jerky playback until they reach a suitable low quality level, and due to repeatedly being put back to the higher levels.
If you got this far, sorry again that it was so long, and thanks for taking the time to read my post even if you can't help.
David
Hi, David -
No problem about the long post.
The player will automatically sort the bitrate levels and will select the highest quality available that fits in the player window and whose bitrate is below the reported bandwidth on the client.
In the current implementation, quality levels are blacklisted for 30 seconds, and then allowed to return. This behavior is hardcoded into the player, so to work around it would require code customization.
See above.
The exact level won't carry over, since the levels for two items may not line up at all. The user's reported bandwidth is saved however, and used to select the next item's level.
RTMP dynamic streaming is a purely client-side implementation, so there's not much you can do server-side.
I think this would be better done as a player customization, where you modify the logic of the RTMP media provider. Otherwise, the bitrate switching logic, which is already quite complicated, might become even more unwieldy.
Dynamic streaming isn't required to access dropped frames info from Flash. You can access that data directly from the NetStream object. Again, for what you're trying to do, I think you'll be better off doing some code customization.
Yes, the player's dropped frames heuristic isn't as sensitive as the bandwidth one. This is because factors other than pure computing power can lead to dropped frames. For example, an otherwise capable system may become momentarily bogged down by a crashing application or any other number of factors.
Again, you're making assumptions about why the dropped frames occurred.
In that case, feel free to customize the code! Since none of this stuff is standardized, we've had to make judgements as to what the optimal experience should be in terms of dynamic streaming, but if you'd like to take a stab at it, the player's source code is available on our developer site.
Good luck!