Git Product home page Git Product logo

Comments (9)

stephanterning avatar stephanterning commented on July 18, 2024

<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.

stephanterning avatar stephanterning commented on July 18, 2024

One area we suspect could be the culprit is Media Capabilities API

from rx-player.

peaBerberian avatar peaBerberian commented on July 18, 2024

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.

stephanterning avatar stephanterning commented on July 18, 2024

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.

stephanterning avatar stephanterning commented on July 18, 2024

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.

peaBerberian avatar peaBerberian commented on July 18, 2024

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.

peaBerberian avatar peaBerberian commented on July 18, 2024

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.

stephanterning avatar stephanterning commented on July 18, 2024

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.

peaBerberian avatar peaBerberian commented on July 18, 2024

Interesting. Thanks for keeping me up-to-date on this!

from rx-player.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.