Adaptive bitrate streaming is not working properly (not adapting to varying user bandwidth) in our android TV app using Bitmovin Player (com.bitmovin.player) version 3.9.0 while playing 4k streaming content(.mpd), which uses HEVC video codec.
Problem Details:
-
A lot of re-buffering was observed visually when some 4k content was played in our android TV application.
The problem was further investigated using the Bitmovin Analytics and similar results were confirmed. -
We can see that video bitrate is stuck at ~15 mbps connection, lots of re-buffering happening on a decent network bandwidth which seems suffice to play a lower video bitrate.
More observations:
2. a) If the video playback is started at a bandwidth >= needed to play 4k video and if the bandwidth drops down subsequently. Result → Video bitrate gets stuck at 15 mbps and re-buffering problem appears.
- b) If the video playback is started at a low bandwidth (to play 4k content), then the video playback properly adapts to varying network bandwidths till it gets high enough to request a 15 mbps chunk.
The manifest:
The analysis of several such manifest files(.mpd) suggests that there are representations available for lower bandwidth requests but are not being used effectively by the player.
Sample of 1 such manifest added below:
<?xml version="1.0" encoding="UTF-8"?>
<MPD type="static" xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:dvb:dash:profile:dvb-dash:2014,urn:dvb:dash:profile:dvb-dash:isoff-ext-live:2014" minBufferTime="PT1.033S" mediaPresentationDuration="PT52M40.747S" maxSegmentDuration="PT3.840S">
<Period duration="PT52M40.747S" start="PT0S">
<AdaptationSet startWithSAP="2" segmentAlignment="true" par="16:9" id="1" sar="1:1" frameRate="25" contentType="video" scanType="progressive" mimeType="video/mp4" >
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<SegmentTemplate startNumber="1" timescale="1000" duration="3840" media="$RepresentationID$/$Number%06d$.m4s" initialization="$RepresentationID$/IS.mp4" />
<Representation id="706c3192-3e77-b20e-2732-fc7f2af2f3f7/video=18160000/dur=3840" codecs="hev1.2.4.L153.00.00.90" height="2160" width="3840" bandwidth="21245064" />
<Representation id="3b511ba7-1eec-ba01-4244-651baf1b5c71/video=12640000/dur=3840" codecs="hev1.2.4.L153.00.00.90" height="1800" width="3200" bandwidth="15164760" />
<Representation id="eb2dbe8f-531f-3775-0137-a7faccb79cb9/video=8080000/dur=3840" codecs="hev1.2.4.L150.00.00.90" height="1440" width="2560" bandwidth="9717584" />
<Representation id="2d109f33-a12e-0d86-5021-2122b5e3b4a0/video=6300000/dur=3840" codecs="hev1.2.4.L150.00.00.90" height="1080" width="1920" bandwidth="7633424" />
<Representation id="9a281e1d-4206-3daa-3160-efa2aa4c3fb2/video=4600000/dur=3840" codecs="hev1.2.4.L150.00.00.90" height="900" width="1600" bandwidth="5614352" />
<Representation id="7f61f4f5-2b6b-ab31-32f0-34fa655227a6/video=3000000/dur=3840" codecs="hev1.2.4.L120.00.00.90" height="720" width="1280" bandwidth="3811992" />
<Representation id="66ce2a3d-7350-62e4-39e5-be9f377e57d1/video=2000000/dur=3840" codecs="hev1.2.4.L93.00.00.90" height="540" width="960" bandwidth="2634408" />
<Representation id="479a3345-15bc-4c73-32ab-bcdd0ec6b208/video=1100000/dur=3840" codecs="hev1.2.4.L90.00.00.90" height="432" width="768" bandwidth="1529584" />
</AdaptationSet>
<AdaptationSet startWithSAP="2" segmentAlignment="true" id="3" codecs="mp4a.40.2" audioSamplingRate="48000" contentType="audio" lang="eng" mimeType="audio/mp4" >
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<SegmentTemplate startNumber="1" timescale="1000" duration="3840" media="$RepresentationID$/$Number%06d$.m4s" initialization="$RepresentationID$/IS.mp4" />
<Representation id="c3786f6d-fe5a-2e84-e9a9-9a1caf0aba61/audio=192000/dur=3840" bandwidth="190880" />
</AdaptationSet>
</Period>
</MPD>
The implementation:
Currently our Android TV app is using Bitmovin Player library “com.bitmovin.player:player”
version 3.9.0 and Bitmovin Player Analytics library “com.bitmovin.analytics:collector-bitmovin-player”
version 2.4.0.
The current implementation doesn’t have any custom adaptation, so it is working as the default behaviour of the player library.
Thanks a lot for your help.