Comments (9)
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" profiles="urn:hbbtv:dash:profile:isoff-live:2012,urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2023-05-15T22:28:51.401752048Z" publishTime="2023-07-07T12:11:18.648297763Z" minimumUpdatePeriod="PT3.2S" minBufferTime="PT6.4S" timeShiftBufferDepth="PT32S" suggestedPresentationDelay="PT6.4S"> <Period id="0" start="PT0S"> <AdaptationSet id="0" contentType="video" segmentAlignment="true" frameRate="50" scanType="progressive" group="1"> <SegmentTemplate initialization="1882187a780/dash-v$RepresentationID$/v$RepresentationID$-init.mp4" media="1882187a780/dash-v$RepresentationID$/v$RepresentationID$-$Number$.mp4" startNumber="1" timescale="90000" duration="288000"/> <Representation id="0" bandwidth="406000" width="416" height="234" codecs="avc1.42C015" mimeType="video/mp4"/> <Representation id="1" bandwidth="1092000" width="640" height="360" codecs="avc1.64001F" mimeType="video/mp4"/> <Representation id="2" bandwidth="2480000" width="960" height="540" codecs="avc1.64001F" mimeType="video/mp4"/> <Representation id="3" bandwidth="4794000" width="1280" height="720" codecs="avc1.640020" mimeType="video/mp4"/> <Representation id="4" bandwidth="5943000" width="1280" height="720" codecs="avc1.640020" mimeType="video/mp4"/> </AdaptationSet> <AdaptationSet id="1" contentType="audio" segmentAlignment="true" group="2" lang="sv"> <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/> <SegmentTemplate initialization="1882187a780/dash-a0/a0-init.mp4" media="1882187a780/dash-a0/a0-$Number$.mp4" startNumber="1" timescale="90000" duration="288000"/> <Label>Svenska</Label> <Representation id="5" bandwidth="130000" codecs="mp4a.40.2" audioSamplingRate="48000" mimeType="audio/mp4"> <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> </Representation> </AdaptationSet> <AdaptationSet id="2" contentType="audio" segmentAlignment="true" group="2" lang="sv-x-tal"> <Role schemeIdUri="urn:mpeg:dash:role:2011" value="dub"/> <SegmentTemplate initialization="1882187a780/dash-a1/a1-init.mp4" media="1882187a780/dash-a1/a1-$Number$.mp4" startNumber="1" timescale="90000" duration="288000"/> <Label>Uppläst undertext</Label> <Representation id="6" bandwidth="130000" codecs="mp4a.40.2" audioSamplingRate="48000" mimeType="audio/mp4"> <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/> </Representation> </AdaptationSet> <AdaptationSet id="3" contentType="text" segmentAlignment="true" group="3" lang="sv"> <Role schemeIdUri="urn:mpeg:dash:role:2011" value="caption"/> <SegmentTemplate initialization="1882187a780/dash-s0/s0-init.mp4" media="1882187a780/dash-s0/s0-$Number$.mp4" startNumber="1" timescale="90000" duration="288000"/> <Representation id="7" bandwidth="5000" codecs="stpp" mimeType="application/mp4"/> </AdaptationSet> </Period> <UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-iso:2014" value="https://time.akamai.com/?iso"/> </MPD>
from rx-player.
One area we suspect could be the culprit is Media Capabilities API
from rx-player.
Hi,
One area we suspect could be the culprit is Media Capabilities API
In which way? The RxPlayer does not use this API for now for Representation selection, in the fear of false negatives, though the shaka-player and dash.js do in some way.
You mean that the RxPlayer selects Representations/qualities it shouldn't have - and could have known that it shouldn't have by checking the output of the Media Capabilities API?
Do the RxPlayer selects higher qualities than the other players?
The fact that audio and subtitles continue is the weird part, it seems that the hardware has issues decoding the video.
I don't have access to a VPN sadly for now, could you share DEBUG Logs (RxPlayer.LogLevel = "DEBUG"
)?
from rx-player.
You mean that the RxPlayer selects Representations/qualities it shouldn't have - and could have known that it shouldn't have by checking the output of the Media Capabilities API? Do the RxPlayer selects higher qualities than the other players? The fact that audio and subtitles continue is the weird part, it seems that the hardware has issues decoding the video.
Ok, so probably not the Media Capabilities API then, but perhaps something around selection of video representations.
We have got reports of limiting the player to play lower bandwidth representations solves the issue. And the top two representations of the provided example manifest have a different avc profile than the lower bitrates. So something makes the player select those (avc1.640020) but the devices then don't manage to play them back I guess. We haven't verified this behaviour, but it's a probable cause.
We haven't changed the manifests for several years regarding avc profiles and bitrate ladder, so something else has changed, and it's seems to be only chromium based browsers on Android devices that has this issue.
I don't have access to a VPN sadly for now, could you share DEBUG Logs (
RxPlayer.LogLevel = "DEBUG"
)?
Yes, we'll continue investigating this next week and we'll provide some debug logs.
from rx-player.
A video recording showing the issue: https://youtube.com/shorts/xTzX0JVikso?feature=share
The debug log from the session:
RxPlayer.LogLevel = "DEBUG" 'DEBUG' lib.js:21 loadvideo {autoPlay: true, defaultAudioTrack: undefined, defaultTextTrack: undefined, hideNativeSubtitle: false, keySystems: Array(0), …} lib.js:21 playerStateChange LOADING lib.js:21 creating MediaSource lib.js:21 attaching MediaSource URL to video element blob:https://developers.canal-plus.com/38b043d2-7122-406d-bece-0f98ff88df4e lib.js:21 set duration NaN lib.js:21 calculating initial time lib.js:21 initial time calculated: 0 lib.js:21 adding native SourceBuffer with codec video/mp4;codecs="avc1.42c01f" lib.js:21 adding native SourceBuffer with codec audio/mp4;codecs="mp4a.40.2" lib.js:21 creating new Buffer for audio e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 creating new Buffer for video e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 creating new Buffer for text e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 creating new Buffer for image e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 updating audio adaptation e {id: '2', type: 'audio', representations: Array(1), language: 'sv', normalizedLanguage: 'swe', …} e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 reusing a previous SourceBuffer for the type audio lib.js:21 changing representation audio e {id: '10', bitrate: 197063, codec: 'mp4a.40.2', mimeType: 'audio/mp4', index: e} lib.js:21 starting downloading queue audio lib.js:21 updating video adaptation e {id: '1', type: 'video', representations: Array(5), manuallyAdded: false} e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 reusing a previous SourceBuffer for the type video lib.js:21 changing representation video e {id: '9', bitrate: 590200, codec: 'avc1.42c01f', height: 234, width: 416, …} lib.js:21 starting downloading queue video lib.js:21 set no text Adaptation e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 new active period e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 set no image Adaptation e {id: '0', adaptations: {…}, duration: 3610.800048828, start: 0, end: 3610.800048828} lib.js:21 resume playback speed 1 lib.js:21 pushing data to source buffer {segment: Uint8Array(823), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(831), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(94590), timestampOffset: 0} lib.js:21 updating downloading queue audio lib.js:21 updating downloading queue video lib.js:21 set initial time 0 lib.js:21 updating downloading queue audio lib.js:21 updating downloading queue video lib.js:21 pause playback to build buffer lib.js:21 pushing data to source buffer {segment: Uint8Array(272649), timestampOffset: 0} lib.js:21 updating downloading queue audio lib.js:21 updating downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(92905), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(220565), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(92935), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(93096), timestampOffset: 0} lib.js:21 updating downloading queue audio lib.js:21 ABR - calculated bitrate: 75887636.3422283 lib.js:21 changing representation video e {id: '5', bitrate: 5578961, codec: 'avc1.640029', height: 1080, width: 1920, …} lib.js:21 starting downloading queue video lib.js:21 resume playback speed 1 lib.js:21 updating downloading queue audio lib.js:21 ABR - calculated bitrate: 75887636.3422283 lib.js:21 updating downloading queue video lib.js:21 canplay event lib.js:21 updating downloading queue audio lib.js:21 ABR - calculated bitrate: 75887636.3422283 lib.js:21 updating downloading queue video lib.js:21 updating downloading queue audio lib.js:21 ABR - calculated bitrate: 75887636.3422283 lib.js:21 updating downloading queue video lib.js:21 playerStateChange LOADED lib.js:21 playerStateChange PLAYING lib.js:21 pushing data to source buffer {segment: Uint8Array(93152), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(876), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1684563), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(92753), timestampOffset: 0} lib.js:21 updating downloading queue audio lib.js:21 ABR - calculated bitrate: 274913368.6180904 lib.js:21 updating downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(93160), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(93271), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1238104), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1563099), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(2097700), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1698556), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1586675), timestampOffset: 0} 2lib.js:21 ABR - calculated bitrate: 343033425.1615039 lib.js:21 starting downloading queue audio lib.js:21 ABR - calculated bitrate: 343033425.1615039 lib.js:21 starting downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(93079), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1454395), timestampOffset: 0} 4lib.js:21 ABR - calculated bitrate: 361409906.70196754 lib.js:21 starting downloading queue audio lib.js:21 ABR - calculated bitrate: 361409906.70196754 lib.js:21 starting downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(92853), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(2641486), timestampOffset: 0} 3lib.js:21 ABR - calculated bitrate: 392898614.14369327 lib.js:21 starting downloading queue audio lib.js:21 ABR - calculated bitrate: 392898614.14369327 lib.js:21 starting downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(93274), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1500974), timestampOffset: 0} 4lib.js:21 ABR - calculated bitrate: 406207762.8198049 lib.js:21 starting downloading queue audio lib.js:21 ABR - calculated bitrate: 406207762.8198049 lib.js:21 starting downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(92925), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1753221), timestampOffset: 0} 4lib.js:21 ABR - calculated bitrate: 415247691.15792286 lib.js:21 starting downloading queue audio lib.js:21 ABR - calculated bitrate: 415247691.15792286 lib.js:21 starting downloading queue video lib.js:21 pushing data to source buffer {segment: Uint8Array(92858), timestampOffset: 0} lib.js:21 pushing data to source buffer {segment: Uint8Array(1657419), timestampOffset: 0} 2lib.js:21 ABR - calculated bitrate: 424353119.6910167 lib.js:21 playerStateChange PAUSED
(The pause at the end is a manual pause)
from rx-player.
OK thanks, judging by the logs and demo page this looks like an old RxPlayer version, which is it?
I can see that we switch from 234p to 1080p. We could just try to forbid 1080p by doing something like player.setMaxVideoBitrate(5000000)
and check if it works better here.
I'm also preparing a test checking through the MediaCapabilities
API if there's hint that some video qualities cannot be played.
from rx-player.
We can also test the support of the various qualities to try calling for each representation a code looking like this:
const mediaConfig = {
type: 'media-source',
video: {
contentType: 'video/mp4;codecs="avc1.640029"', // mimetype, then ";", then `codecs=` then the codec between quotes
width: 1920, // found in the MPD
height: 1080, // found in the MPD
bitrate: 5578961, // found in the MPD, as the Representation's `bandwidth` attribute
framerate: 25 // found in the MPD, for the corresponding Representation or AdaptationSet
}
};
navigator.mediaCapabilities.decodingInfo(mediaConfig).then(result => {
console.log('This configuration is' +
(result.supported ? '' : ' NOT') + ' supported,' +
(result.smooth ? '' : ' NOT') + ' smooth and' +
(result.powerEfficient ? '' : ' NOT') + ' power efficient.');
});
We don't care much about power efficiency here, but we do about support and smoothness.
from rx-player.
For unknown reasons we have stopped getting complaints from users and on some of the devices that we got this issue on previously and have had the opportunity to re-test on, it now works. So this issue can be closed. I guess Google fixed something they broke in an earlier release.
from rx-player.
Interesting. Thanks for keeping me up-to-date on this!
from rx-player.
Related Issues (20)
- KEY_GENERATE_REQUEST_ERROR - The initDataType parameter is empty (observed on Tizen 2017) HOT 7
- Check Dolby Atmos and Dolby Vision in current stream HOT 3
- Unable to play some streams in Edge browser on RxPlayer v3.30.0 HOT 11
- Streams freeze on first frame with audio only playback on Edge browser (and probably Chrome) HOT 6
- Safari 17 brings MSE to iOS HOT 10
- Some DASH/Widevine streams are looping on a Vestel MB130 HOT 3
- First playback of PlayReady content fails on EDGE browsers HOT 3
- PIPELINE_ERROR_DECODE error observed in Edge browser when zapping live channels HOT 2
- Safari 17.1 issue with playback DRM content HOT 3
- playing MKV VOD with multi Audio track HOT 7
- Infinity loading state on Safari Mobile when autoplay is false HOT 17
- Arrêt brutal du player en Replay sur le mycanal sur HOT 4
- PIPELINE_ERROR_INVALID_STATE error when using Playready/Dash stream (mixed encrypted/unecrypted content) HOT 9
- fromFirstPosition does not start from actual first position in live DASH manifest (multi period live with SSAI) HOT 2
- Freezed VOD stream and lot of audio discontinuities on Samsung Tizen 2017 HOT 11
- Pre-fetching DRM licenses for current and future content
- Widevine LD fallback not triggering in RxPlayer HOT 7
- dashif:laurl not parsed after recent changes
- Resolve base url not correct when root MPD base url start with `/` HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rx-player.