From fc5b69c031a7b026b2df7f1721a885c79552b48b Mon Sep 17 00:00:00 2001 From: Gabe Kangas Date: Sun, 19 Sep 2021 23:32:47 -0700 Subject: [PATCH] WIP player debug/test page. #1408 --- controllers/index.go | 8 +- router/middleware/cors.go | 1 + webroot/test/README.md | 1000 +++++ webroot/test/index.html | 322 ++ webroot/test/old-index.html | 150 + .../test/scripts/dash-manifest-object.json | 3553 +++++++++++++++++ webroot/test/scripts/hls-manifest-object.json | 380 ++ webroot/test/scripts/index.js | 768 ++++ webroot/test/scripts/sources.json | 76 + 9 files changed, 6255 insertions(+), 3 deletions(-) create mode 100644 webroot/test/README.md create mode 100644 webroot/test/index.html create mode 100644 webroot/test/old-index.html create mode 100644 webroot/test/scripts/dash-manifest-object.json create mode 100644 webroot/test/scripts/hls-manifest-object.json create mode 100644 webroot/test/scripts/index.js create mode 100644 webroot/test/scripts/sources.json diff --git a/controllers/index.go b/controllers/index.go index 3f37f1083..619280de3 100644 --- a/controllers/index.go +++ b/controllers/index.go @@ -35,7 +35,7 @@ type MetadataPage struct { // IndexHandler handles the default index route. func IndexHandler(w http.ResponseWriter, r *http.Request) { middleware.EnableCors(w) - isIndexRequest := r.URL.Path == "/" || filepath.Base(r.URL.Path) == "index.html" || filepath.Base(r.URL.Path) == "" + isIndexRequest := r.URL.Path == "/" || r.URL.Path == "/test/" || filepath.Base(r.URL.Path) == "index.html" || filepath.Base(r.URL.Path) == "" // For search engine bots and social scrapers return a special // server-rendered page. @@ -65,8 +65,10 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) { // Set a cache control max-age header middleware.SetCachingHeaders(w, r) - // Set our global HTTP headers - middleware.SetHeaders(w) + // Set our global HTTP headers except on our test page + if r.URL.Path != "/test/" { + middleware.SetHeaders(w) + } http.ServeFile(w, r, path.Join(config.WebRoot, r.URL.Path)) } diff --git a/router/middleware/cors.go b/router/middleware/cors.go index 6f486a236..7caff66e6 100644 --- a/router/middleware/cors.go +++ b/router/middleware/cors.go @@ -7,4 +7,5 @@ import ( // EnableCors enables the CORS header on the responses. func EnableCors(w http.ResponseWriter) { w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Headers", "Range") } diff --git a/webroot/test/README.md b/webroot/test/README.md new file mode 100644 index 000000000..f0e425a04 --- /dev/null +++ b/webroot/test/README.md @@ -0,0 +1,1000 @@ +VHS Logo consisting of a VHS tape, the Video.js logo and the words VHS + +# videojs-http-streaming (VHS) + +[![Build Status][travis-icon]][travis-link] +[![Slack Status][slack-icon]][slack-link] +[![Greenkeeper badge][greenkeeper-icon]][greenkeeper-link] + +Play HLS, DASH, and future HTTP streaming protocols with video.js, even where they're not +natively supported. + +Included in video.js 7 by default! See the [video.js 7 blog post](https://blog.videojs.com/video-js-7-is-here/) + +Maintenance Status: Stable + +Video.js Compatibility: 6.0, 7.0 + + + + + +- [Installation](#installation) + - [NPM](#npm) + - [CDN](#cdn) + - [Releases](#releases) + - [Manual Build](#manual-build) +- [Contributing](#contributing) +- [Troubleshooting](#troubleshooting) +- [Talk to us](#talk-to-us) +- [Getting Started](#getting-started) +- [Compatibility](#compatibility) + - [Browsers which support MSE](#browsers-which-support-mse) + - [Native only](#native-only) + - [Flash Support](#flash-support) + - [DRM](#drm) +- [Documentation](#documentation) + - [Options](#options) + - [How to use](#how-to-use) + - [Initialization](#initialization) + - [Source](#source) + - [List](#list) + - [withCredentials](#withcredentials) + - [handleManifestRedirects](#handlemanifestredirects) + - [useCueTags](#usecuetags) + - [parse708captions](#parse708captions) + - [overrideNative](#overridenative) + - [blacklistDuration](#blacklistduration) + - [maxPlaylistRetries](#maxplaylistretries) + - [bandwidth](#bandwidth) + - [useBandwidthFromLocalStorage](#usebandwidthfromlocalstorage) + - [enableLowInitialPlaylist](#enablelowinitialplaylist) + - [limitRenditionByPlayerDimensions](#limitrenditionbyplayerdimensions) + - [useDevicePixelRatio](#usedevicepixelratio) + - [smoothQualityChange](#smoothqualitychange) + - [allowSeeksWithinUnsafeLiveWindow](#allowseekswithinunsafelivewindow) + - [customTagParsers](#customtagparsers) + - [customTagMappers](#customtagmappers) + - [cacheEncryptionKeys](#cacheencryptionkeys) + - [handlePartialData](#handlepartialdata) + - [liveRangeSafeTimeDelta](#liverangesafetimedelta) + - [captionServices](#captionservices) + - [Format](#format) + - [Example](#example) + - [Runtime Properties](#runtime-properties) + - [vhs.playlists.master](#vhsplaylistsmaster) + - [vhs.playlists.media](#vhsplaylistsmedia) + - [vhs.systemBandwidth](#vhssystembandwidth) + - [vhs.bandwidth](#vhsbandwidth) + - [vhs.throughput](#vhsthroughput) + - [vhs.selectPlaylist](#vhsselectplaylist) + - [vhs.representations](#vhsrepresentations) + - [vhs.xhr](#vhsxhr) + - [vhs.stats](#vhsstats) + - [Events](#events) + - [loadedmetadata](#loadedmetadata) + - [VHS Usage Events](#vhs-usage-events) + - [Presence Stats](#presence-stats) + - [Use Stats](#use-stats) + - [In-Band Metadata](#in-band-metadata) + - [Segment Metadata](#segment-metadata) + - [Object as Source](#object-as-source) +- [Hosting Considerations](#hosting-considerations) +- [Known Issues and Workarounds](#known-issues-and-workarounds) + - [Fragmented MP4 Support](#fragmented-mp4-support) + - [Assets with an Audio-Only Rate Get Stuck in Audio-Only](#assets-with-an-audio-only-rate-get-stuck-in-audio-only) + - [DASH Assets with `$Time` Interpolation and `SegmentTimeline`s with No `t`](#dash-assets-with-time-interpolation-and-segmenttimelines-with-no-t) +- [Testing](#testing) +- [Debugging](#debugging) +- [Release History](#release-history) +- [Building](#building) +- [Development](#development) + - [Tools](#tools) + - [Commands](#commands) + + + +## Installation +### NPM +To install `videojs-http-streaming` with npm run + +```bash +npm install --save @videojs/http-streaming +``` + +### CDN +Select a version of VHS from the [CDN](https://unpkg.com/@videojs/http-streaming/dist/) + +### Releases +Download a release of [videojs-http-streaming](https://github.com/videojs/http-streaming/releases) + +### Manual Build +Download a copy of this git repository and then follow the steps in [Building](#building) + +## Contributing +See [CONTRIBUTING.md](/CONTRIBUTING.md) + +## Troubleshooting +See [our troubleshooting guide](/docs/troubleshooting.md) + +## Talk to us +Drop by our slack channel (#playback) on the [Video.js slack][slack-link]. + +## Getting Started +This library is included in video.js 7 by default, if you are using an older version of video.js then +get a copy of [videojs-http-streaming](#installation) and include it in your page along with video.js: + +```html + + + + + + +``` + +Check out our [live example](https://jsbin.com/gejugat/edit?html,output) if you're having trouble. + +Is it recommended to use the `` element or load a source with `player.src(sourceObject)` in order to prevent the video element from playing the source natively where HLS is supported. + +## Compatibility + +The [Media Source Extensions](http://caniuse.com/#feat=mediasource) API is required for http-streaming to play HLS or MPEG-DASH. + +### Browsers which support MSE + +- Chrome +- Firefox +- Internet Explorer 11 Windows 10 or 8.1 + +These browsers have some level of native HLS support, which will be used unless the [overrideNative](#overridenative) option is used: + +- Chrome Android +- Firefox Android +- Edge + +### Native only + +- Mac Safari +- iOS Safari + +Mac Safari does have MSE support, but native HLS is recommended + +### Flash Support +This plugin does not support Flash playback. Instead, it is recommended that users use the [videojs-flashls-source-handler](https://github.com/brightcove/videojs-flashls-source-handler) plugin as a fallback option for browsers that don't have a native +[HLS](https://caniuse.com/#feat=http-live-streaming)/[DASH](https://caniuse.com/#feat=mpeg-dash) player or support for [Media Source Extensions](http://caniuse.com/#feat=mediasource). + +### DRM + +DRM is supported through [videojs-contrib-eme](https://github.com/videojs/videojs-contrib-eme). In order to use DRM, include the videojs-contrib-eme plug, [initialize it](https://github.com/videojs/videojs-contrib-eme#initialization), and add options to either the [plugin](https://github.com/videojs/videojs-contrib-eme#plugin-options) or the [source](https://github.com/videojs/videojs-contrib-eme#source-options). + +Detailed option information can be found in the [videojs-contrib-eme README](https://github.com/videojs/videojs-contrib-eme/blob/master/README.md). + +## Documentation +[HTTP Live Streaming](https://developer.apple.com/streaming/) (HLS) has +become a de-facto standard for streaming video on mobile devices +thanks to its native support on iOS and Android. There are a number of +reasons independent of platform to recommend the format, though: + +- Supports (client-driven) adaptive bitrate selection +- Delivered over standard HTTP ports +- Simple, text-based manifest format +- No proprietary streaming servers required + +Unfortunately, all the major desktop browsers except for Safari are +missing HLS support. That leaves web developers in the unfortunate +position of having to maintain alternate renditions of the same video +and potentially having to forego HTML-based video entirely to provide +the best desktop viewing experience. + +This project addresses that situation by providing a polyfill for HLS +on browsers that have support for [Media Source +Extensions](http://caniuse.com/#feat=mediasource). +You can deploy a single HLS stream, code against the +regular HTML5 video APIs, and create a fast, high-quality video +experience across all the big web device categories. + +Check out the [full documentation](docs/README.md) for details on how HLS works +and advanced configuration. A description of the [adaptive switching +behavior](docs/bitrate-switching.md) is available, too. + +videojs-http-streaming supports a bunch of HLS features. Here +are some highlights: + +- video-on-demand and live playback modes +- backup or redundant streams +- mid-segment quality switching +- AES-128 segment encryption +- CEA-608 captions are automatically translated into standard HTML5 + [caption text tracks][0] +- In-Manifest WebVTT subtitles are automatically translated into standard HTML5 + subtitle tracks +- Timed ID3 Metadata is automatically translated into HTML5 metedata + text tracks +- Highly customizable adaptive bitrate selection +- Automatic bandwidth tracking +- Cross-domain credentials support with CORS +- Tight integration with video.js and a philosophy of exposing as much + as possible with standard HTML APIs +- Stream with multiple audio tracks and switching to those audio tracks + (see the docs folder) for info +- Media content in + [fragmented MP4s](https://developer.apple.com/videos/play/wwdc2016/504/) + instead of the MPEG2-TS container format. + +[0]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track + +For a more complete list of supported and missing features, refer to +[this doc](docs/supported-features.md). + +### Options +#### How to use + +##### Initialization +You may pass in an options object to the hls source handler at player +initialization. You can pass in options just like you would for other +parts of video.js: + +```javascript +// html5 for html hls +videojs(video, { + html5: { + vhs: { + withCredentials: true + } + } +}); +``` + +##### Source +Some options, such as `withCredentials` can be passed in to vhs during +`player.src` + +```javascript + +var player = videojs('some-video-id'); + +player.src({ + src: 'https://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8', + type: 'application/x-mpegURL', + withCredentials: true +}); +``` + +#### List +##### withCredentials +* Type: `boolean` +* can be used as a source option +* can be used as an initialization option + +When the `withCredentials` property is set to `true`, all XHR requests for +manifests and segments would have `withCredentials` set to `true` as well. This +enables storing and passing cookies from the server that the manifests and +segments live on. This has some implications on CORS because when set, the +`Access-Control-Allow-Origin` header cannot be set to `*`, also, the response +headers require the addition of `Access-Control-Allow-Credentials` header which +is set to `true`. +See html5rocks's [article](http://www.html5rocks.com/en/tutorials/cors/) +for more info. + +##### handleManifestRedirects +* Type: `boolean` +* Default: `false` +* can be used as a source option +* can be used as an initialization option + +When the `handleManifestRedirects` property is set to `true`, manifest requests +which are redirected will have their URL updated to the new URL for future +requests. + +##### useCueTags +* Type: `boolean` +* can be used as an initialization option + +When the `useCueTags` property is set to `true,` a text track is created with +label 'ad-cues' and kind 'metadata'. The track is then added to +`player.textTracks()`. Changes in active cue may be +tracked by following the Video.js cue points API for text tracks. For example: + +```javascript +let textTracks = player.textTracks(); +let cuesTrack; + +for (let i = 0; i < textTracks.length; i++) { +  if (textTracks[i].label === 'ad-cues') { +    cuesTrack = textTracks[i]; +  } +} + +cuesTrack.addEventListener('cuechange', function() { + let activeCues = cuesTrack.activeCues; + +  for (let i = 0; i < activeCues.length; i++) { + let activeCue = activeCues[i]; + +    console.log('Cue runs from ' + activeCue.startTime + + ' to ' + activeCue.endTime); +  } +}); +``` + +##### parse708captions +* Type: `boolean` +* Default: `true` +* can be used as an initialization option + +When set to `false`, 708 captions in the stream are not parsed and will not show up in text track lists or the captions menu. + +##### overrideNative +* Type: `boolean` +* can be used as an initialization option + +Try to use videojs-http-streaming even on platforms that provide some +level of HLS support natively. There are a number of platforms that +*technically* play back HLS content but aren't very reliable or are +missing features like CEA-608 captions support. When `overrideNative` +is true, if the platform supports Media Source Extensions +videojs-http-streaming will take over HLS playback to provide a more +consistent experience. + +```javascript +// via the constructor +var player = videojs('playerId', { + html5: { + vhs: { + overrideNative: true + }, + nativeAudioTracks: false, + nativeVideoTracks: false + } +}); +``` + +Since MSE playback may be desirable on all browsers with some native support other than Safari, `overrideNative: !videojs.browser.IS_SAFARI` could be used. + +##### blacklistDuration +* Type: `number` +* can be used as an initialization option + +When the `blacklistDuration` property is set to a time duration in seconds, +if a playlist is blacklisted, it will be blacklisted for a period of that +customized duration. This enables the blacklist duration to be configured +by the user. + +##### maxPlaylistRetries +* Type: `number` +* Default: `Infinity` +* can be used as an initialization option + +The max number of times that a playlist will retry loading following an error +before being indefinitely excluded from the rendition selection algorithm. Note: the number of retry attempts needs to _exceed_ this value before a playlist will be excluded. + +##### bandwidth +* Type: `number` +* can be used as an initialization option + +When the `bandwidth` property is set (bits per second), it will be used in +the calculation for initial playlist selection, before more bandwidth +information is seen by the player. + +##### useBandwidthFromLocalStorage +* Type: `boolean` +* can be used as an initialization option + +If true, `bandwidth` and `throughput` values are stored in and retrieved from local +storage on startup (for initial rendition selection). This setting is `false` by default. + +##### enableLowInitialPlaylist +* Type: `boolean` +* can be used as an initialization option + +When `enableLowInitialPlaylist` is set to true, it will be used to select +the lowest bitrate playlist initially. This helps to decrease playback start time. +This setting is `false` by default. + +##### limitRenditionByPlayerDimensions +* Type: `boolean` +* can be used as an initialization option + +When `limitRenditionByPlayerDimensions` is set to true, rendition +selection logic will take into account the player size and rendition +resolutions when making a decision. +This setting is `true` by default. + +##### useDevicePixelRatio +* Type: `boolean` +* can be used as an initialization option. + +If true, this will take the device pixel ratio into account when doing rendition switching. This means that if you have a player with the width of `540px` in a high density display with a device pixel ratio of 2, a rendition of `1080p` will be allowed. +This setting is `false` by default. + +##### smoothQualityChange +* NOTE: DEPRECATED +* Type: `boolean` +* can be used as a source option +* can be used as an initialization option + +smoothQualityChange is deprecated and will be removed in the next major version of VHS. + +Instead of its prior behavior, smoothQualityChange will now call fastQualityChange, which +clears the buffer, chooses a new rendition, and starts loading content from the current +playhead position. + +##### allowSeeksWithinUnsafeLiveWindow +* Type: `boolean` +* can be used as a source option + +When `allowSeeksWithinUnsafeLiveWindow` is set to `true`, if the active playlist is live +and a seek is made to a time between the safe live point (end of manifest minus three +times the target duration, +see [the hls spec](https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-6.3.3) +for details) and the end of the playlist, the seek is allowed, rather than corrected to +the safe live point. + +This option can help in instances where the live stream's target duration is greater than +the segment durations, playback ends up in the unsafe live window, and there are gaps in +the content. In this case the player will attempt to seek past the gaps but end up seeking +inside of the unsafe range, leading to a correction and seek back into a previously played +content. + +The property defaults to `false`. + +##### customTagParsers +* Type: `Array` +* can be used as a source option + +With `customTagParsers` you can pass an array of custom m3u8 tag parser objects. See https://github.com/videojs/m3u8-parser#custom-parsers + +##### customTagMappers +* Type: `Array` +* can be used as a source option + +Similar to `customTagParsers`, with `customTagMappers` you can pass an array of custom m3u8 tag mapper objects. See https://github.com/videojs/m3u8-parser#custom-parsers + +##### cacheEncryptionKeys +* Type: `boolean` +* can be used as a source option +* can be used as an initialization option + +This option forces the player to cache AES-128 encryption keys internally instead of requesting the key alongside every segment request. +This option defaults to `false`. + +##### handlePartialData +* Type: `boolean`, +* Default: `false` +* Use partial appends in the transmuxer and segment loader + +##### liveRangeSafeTimeDelta +* Type: `number`, +* Default: [`SAFE_TIME_DELTA`](https://github.com/videojs/http-streaming/blob/e7cb63af010779108336eddb5c8fd138d6390e95/src/ranges.js#L17) +* Allow to re-define length (in seconds) of time delta when you compare current time and the end of the buffered range. + +##### captionServices +* Type: `object` +* Default: undefined +* Provide extra information, like a label or a language, for instream (608 and 708) captions. + +The captionServices options object has properties that map to the caption services. Each property is an object itself that includes several properties, like a label or language. + +For 608 captions, the service names are `CC1`, `CC2`, `CC3`, and `CC4`. For 708 captions, the service names are `SERVICEn` where `n` is a digit between `1` and `63`. +###### Format +```js +{ + vhs: { + captionServices: { + [serviceName]: { + language: String, // optional + label: String, // optional + default: boolean // optional + } + } + } +} +``` +###### Example +```js +{ + vhs: { + captionServices: { + CC1: { + language: 'en', + label: 'English' + }, + SERVICE1: { + langauge: 'kr', + label: 'Korean', + default: true + } + } + } +} +``` + +### Runtime Properties +Runtime properties are attached to the tech object when HLS is in +use. You can get a reference to the VHS source handler like this: + +```javascript +var vhs = player.tech().vhs; +``` + +If you *were* thinking about modifying runtime properties in a +video.js plugin, we'd recommend you avoid it. Your plugin won't work +with videos that don't use videojs-http-streaming and the best plugins +work across all the media types that video.js supports. If you're +deploying videojs-http-streaming on your own website and want to make a +couple tweaks though, go for it! + +#### vhs.playlists.master +Type: `object` + +An object representing the parsed master playlist. If a media playlist +is loaded directly, a master playlist with only one entry will be +created. + +#### vhs.playlists.media +Type: `function` + +A function that can be used to retrieve or modify the currently active +media playlist. The active media playlist is referred to when +additional video data needs to be downloaded. Calling this function +with no arguments returns the parsed playlist object for the active +media playlist. Calling this function with a playlist object from the +master playlist or a URI string as specified in the master playlist +will kick off an asynchronous load of the specified media +playlist. Once it has been retreived, it will become the active media +playlist. + +#### vhs.systemBandwidth +Type: `number` + +`systemBandwidth` is a combination of two serial processes' bitrates. The first +is the network bitrate provided by `bandwidth` and the second is the bitrate of +the entire process after that (decryption, transmuxing, and appending) provided +by `throughput`. This value is used by the default implementation of `selectPlaylist` +to select an appropriate bitrate to play. + +Since the two process are serial, the overall system bandwidth is given by: +`systemBandwidth = 1 / (1 / bandwidth + 1 / throughput)` + +#### vhs.bandwidth +Type: `number` + +The number of bits downloaded per second in the last segment download. + +Before the first video segment has been downloaded, it's hard to +estimate bandwidth accurately. The HLS tech uses a starting value of 4194304 or 0.5 MB/s. If you +have a more accurate source of bandwidth information, you can override +this value as soon as the HLS tech has loaded to provide an initial +bandwidth estimate. + +#### vhs.throughput +Type: `number` + +The number of bits decrypted, transmuxed, and appended per second as a cumulative average across active processing time. + +#### vhs.selectPlaylist +Type: `function` + +A function that returns the media playlist object to use to download +the next segment. It is invoked by the tech immediately before a new +segment is downloaded. You can override this function to provide your +adaptive streaming logic. You must, however, be sure to return a valid +media playlist object that is present in `player.tech().vhs.master`. + +Overridding this function with your own is very powerful but is overkill +for many purposes. Most of the time, you should use the much simpler +function below to selectively enable or disable a playlist from the +adaptive streaming logic. + +#### vhs.representations +Type: `function` + +It is recommended to include the [videojs-contrib-quality-levels](https://github.com/videojs/videojs-contrib-quality-levels) plugin to your page so that videojs-http-streaming will automatically populate the QualityLevelList exposed on the player by the plugin. You can access this list by calling `player.qualityLevels()`. See the [videojs-contrib-quality-levels project page](https://github.com/videojs/videojs-contrib-quality-levels) for more information on how to use the api. + +Example, only enabling representations with a width greater than or equal to 720: + +```javascript +var qualityLevels = player.qualityLevels(); + +for (var i = 0; i < qualityLevels.length; i++) { + var quality = qualityLevels[i]; + if (quality.width >= 720) { + quality.enabled = true; + } else { + quality.enabled = false; + } +} +``` + +If including [videojs-contrib-quality-levels](https://github.com/videojs/videojs-contrib-quality-levels) is not an option, you can use the representations api. To get all of the available representations, call the `representations()` method on `player.tech().vhs`. This will return a list of plain objects, each with `width`, `height`, `bandwidth`, and `id` properties, and an `enabled()` method. + +```javascript +player.tech().vhs.representations(); +``` + +To see whether the representation is enabled or disabled, call its `enabled()` method with no arguments. To set whether it is enabled/disabled, call its `enabled()` method and pass in a boolean value. Calling `.enabled(true)` will allow the adaptive bitrate algorithm to select the representation while calling `.enabled(false)` will disallow any selection of that representation. + +Example, only enabling representations with a width greater than or equal to 720: + +```javascript +player.tech().vhs.representations().forEach(function(rep) { + if (rep.width >= 720) { + rep.enabled(true); + } else { + rep.enabled(false); + } +}); +``` + +#### vhs.xhr +Type: `function` + +The xhr function that is used by HLS internally is exposed on the per- +player `vhs` object. While it is possible, we do not recommend replacing +the function with your own implementation. Instead, the `xhr` provides +the ability to specify a `beforeRequest` function that will be called +with an object containing the options that will be used to create the +xhr request. + +Example: +```javascript +player.tech().vhs.xhr.beforeRequest = function(options) { + options.uri = options.uri.replace('example.com', 'foo.com'); + + return options; +}; +``` + +The global `videojs.Vhs` also exposes an `xhr` property. Specifying a +`beforeRequest` function on that will allow you to intercept the options +for *all* requests in every player on a page. For consistency across +browsers the video source should be set at runtime once the video player +is ready. + +Example +```javascript +videojs.Vhs.xhr.beforeRequest = function(options) { + /* + * Modifications to requests that will affect every player. + */ + + return options; +}; + +var player = videojs('video-player-id'); +player.ready(function() { + this.src({ + src: 'https://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8', + type: 'application/x-mpegURL', + }); +}); +``` + +For information on the type of options that you can modify see the +documentation at [https://github.com/Raynos/xhr](https://github.com/Raynos/xhr). + +#### vhs.stats +Type: `object` + +This object contains a summary of HLS and player related stats. + +| Property Name | Type | Description | +| --------------------- | ------ | ----------- | +| bandwidth | number | Rate of the last segment download in bits/second | +| mediaRequests | number | Total number of media segment requests | +| mediaRequestsAborted | number | Total number of aborted media segment requests | +| mediaRequestsTimedout | number | Total number of timedout media segment requests | +| mediaRequestsErrored | number | Total number of errored media segment requests | +| mediaTransferDuration | number | Total time spent downloading media segments in milliseconds | +| mediaBytesTransferred | number | Total number of content bytes downloaded | +| mediaSecondsLoaded | number | Total number of content seconds downloaded | +| buffered | array | List of time ranges of content that are in the SourceBuffer | +| currentTime | number | The current position of the player | +| currentSource | object | The source object. Has the structure `{src: 'url', type: 'mimetype'}` | +| currentTech | string | The name of the tech in use | +| duration | number | Duration of the video in seconds | +| master | object | The [master playlist object](#vhsplaylistsmaster) | +| playerDimensions | object | Contains the width and height of the player | +| seekable | array | List of time ranges that the player can seek to | +| timestamp | number | Timestamp of when `vhs.stats` was accessed | +| videoPlaybackQuality | object | Media playback quality metrics as specified by the [W3C's Media Playback Quality API](https://wicg.github.io/media-playback-quality/) | + + +### Events +Standard HTML video events are handled by video.js automatically and +are triggered on the player object. + +#### loadedmetadata + +Fired after the first segment is downloaded for a playlist. This will not happen +until playback if video.js's `metadata` setting is `none` + +### VHS Usage Events + +Usage tracking events are fired when we detect a certain HLS feature, encoding setting, +or API is used. These can be helpful for analytics, and to pinpoint the cause of HLS errors. +For instance, if errors are being fired in tandem with a usage event indicating that the +player was playing an AES encrypted stream, then we have a possible avenue to explore when +debugging the error. + +Note that although these usage events are listed below, they may change at any time without +a major version change. + +VHS usage events are triggered on the tech with the exception of the 3 vhs-reload-error +events, which are triggered on the player. + +To listen for usage events triggered on the tech, listen for the event type of `'usage'`: + +```javascript +player.on('ready', () => { + player.tech().on('usage', (e) => { + console.log(e.name); + }); +}); +``` + +Note that these events are triggered as soon as a case is encountered, and often only +once. For example, the `vhs-demuxed` usage event will be triggered as soon as the master +manifest is downloaded and parsed, and will not be triggered again. + +#### Presence Stats + +Each of the following usage events are fired once per source if (and when) detected: + +| Name | Description | +| ------------- | ------------- | +| vhs-webvtt | master manifest has at least one segmented WebVTT playlist | +| vhs-aes | a playlist is AES encrypted | +| vhs-fmp4 | a playlist used fMP4 segments | +| vhs-demuxed | audio and video are demuxed by default | +| vhs-alternate-audio | alternate audio available in the master manifest | +| vhs-playlist-cue-tags | a playlist used cue tags (see useCueTags(#usecuetags) for details) | +| vhs-bandwidth-from-local-storage | starting bandwidth was retrieved from local storage (see useBandwidthFromLocalStorage(#useBandwidthFromLocalStorage) for details) | +| vhs-throughput-from-local-storage | starting throughput was retrieved from local storage (see useBandwidthFromLocalStorage(#useBandwidthFromLocalStorage) for details) | + +#### Use Stats + +Each of the following usage events are fired per use: + +| Name | Description | +| ------------- | ------------- | +| vhs-gap-skip | player skipped a gap in the buffer | +| vhs-player-access | player.vhs was accessed | +| vhs-audio-change | a user selected an alternate audio stream | +| vhs-rendition-disabled | a rendition was disabled | +| vhs-rendition-enabled | a rendition was enabled | +| vhs-rendition-blacklisted | a rendition was blacklisted | +| vhs-timestamp-offset | a timestamp offset was set in HLS (can identify discontinuities) | +| vhs-unknown-waiting | the player stopped for an unknown reason and we seeked to current time try to address it | +| vhs-live-resync | playback fell off the back of a live playlist and we resynced to the live point | +| vhs-video-underflow | we seeked to current time to address video underflow | +| vhs-error-reload-initialized | the reloadSourceOnError plugin was initialized | +| vhs-error-reload | the reloadSourceOnError plugin reloaded a source | +| vhs-error-reload-canceled | an error occurred too soon after the last reload, so we didn't reload again (to prevent error loops) | + + +### In-Band Metadata +The HLS tech supports [timed +metadata](https://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/Introduction/Introduction.html) +embedded as [ID3 tags](http://id3.org/id3v2.3.0). When a stream is +encountered with embedded metadata, an [in-band metadata text +track](https://html.spec.whatwg.org/multipage/embedded-content.html#text-track-in-band-metadata-track-dispatch-type) +will automatically be created and populated with cues as they are +encountered in the stream. UTF-8 encoded +[TXXX](http://id3.org/id3v2.3.0#User_defined_text_information_frame) +and [WXXX](http://id3.org/id3v2.3.0#User_defined_URL_link_frame) ID3 +frames are mapped to cue points and their values set as the cue +text. Cues are created for all other frame types and the data is +attached to the generated cue: + +```javascript +cue.value.data +``` + +There are lots of guides and references to using text tracks [around +the web](http://www.html5rocks.com/en/tutorials/track/basics/). + +### Segment Metadata +You can get metadata about the segments currently in the buffer by using the `segment-metadata` +text track. You can get the metadata of the currently rendered segment by looking at the +track's `activeCues` array. The metadata will be attached to the `cue.value` property and +will have this structure + +```javascript +cue.value = { + byteLength, // The size of the segment in bytes + bandwidth, // The peak bitrate reported by the segment's playlist + resolution, // The resolution reported by the segment's playlist + codecs, // The codecs reported by the segment's playlist + uri, // The Segment uri + timeline, // Timeline of the segment for detecting discontinuities + playlist, // The Playlist uri + start, // Segment start time + end // Segment end time +}; +``` + +Example: +Detect when a change in quality is rendered on screen +```javascript +let tracks = player.textTracks(); +let segmentMetadataTrack; + +for (let i = 0; i < tracks.length; i++) { + if (tracks[i].label === 'segment-metadata') { + segmentMetadataTrack = tracks[i]; + } +} + +let previousPlaylist; + +if (segmentMetadataTrack) { + segmentMetadataTrack.on('cuechange', function() { + let activeCue = segmentMetadataTrack.activeCues[0]; + + if (activeCue) { + if (previousPlaylist !== activeCue.value.playlist) { + console.log('Switched from rendition ' + previousPlaylist + + ' to rendition ' + activeCue.value.playlist); + } + previousPlaylist = activeCue.value.playlist; + } + }); +} +``` + +### Object as Source + +*Note* that this is an advanced use-case, and may be more fragile for production +environments, as the schema for a VHS object and how it's used internally are not set in +stone and may change in future releases. + +In normal use, VHS accepts a URL as the source of the video. But VHS also has the ability +to accept a JSON object as the source. + +Passing a JSON object as the source has many uses. A couple of examples include: +* The manifest has already been downloaded, so there's no need to make another request +* You want to change some aspect of the manifest, e.g., add a segment, without modifying + the manifest itself + +In order to pass a JSON object as the source, provide a parsed manifest object in via a +[data URI](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs), +and using the "vnd.videojs.vhs+json" media type when setting the source type. For instance: + +``` +var player = videojs('some-video-id'); +const parser = new M3u8Parser(); + +parser.push(manifestString); +parser.end(); + +player.src({ + src: `data:application/vnd.videojs.vhs+json,${JSON.stringify(parser.manifest)}`, + type: 'application/vnd.videojs.vhs+json' +}); +``` + +The manifest object should follow the "VHS manifest object schema" (a somewhat flexible +and informally documented structure) provided in the README of +[m3u8-parser](https://github.com/videojs/m3u8-parser) and +[mpd-parser](https://github.com/videojs/mpd-parser). This may be referred to in the +project as `vhs-json`. + +## Hosting Considerations +Unlike a native HLS implementation, the HLS tech has to comply with +the browser's security policies. That means that all the files that +make up the stream must be served from the same domain as the page +hosting the video player or from a server that has appropriate [CORS +headers](https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS) +configured. Easy [instructions are +available](http://enable-cors.org/server.html) for popular webservers +and most CDNs should have no trouble turning CORS on for your account. + + +## Known Issues and Workarounds +Issues that are currenty known. If you want to +help find a solution that would be appreciated! + +### Fragmented MP4 Support +Edge has native support for HLS but only in the MPEG2-TS container. If +you attempt to play an HLS stream with fragmented MP4 segments (without +[overriding native playback](#overridenative)), Edge will stall. +Fragmented MP4s are only supported on browsers that have +[Media Source Extensions](http://caniuse.com/#feat=mediasource) available. + +### Assets with an Audio-Only Rate Get Stuck in Audio-Only +Some assets which have an audio-only rate and the lowest-bandwidth +audio + video rate isn't that low get stuck in audio-only mode. This is +because the initial bandwidth calculation thinks it there's insufficient +bandwidth for selecting the lowest-quality audio+video playlist, so it picks +the only-audio one, which unfortunately locks it to being audio-only forever, +preventing a switch to the audio+video playlist when it gets a better +estimation of bandwidth. + +Until we've implemented a full fix, it is recommended to set the +[`enableLowInitialPlaylist` option](#enablelowinitialplaylist) for any assets +that include an audio-only rate; it should always select the lowest-bandwidth +audio+video playlist for its first playlist. + +It's also worth mentioning that Apple no longer requires having an audio-only +rate; instead, they require a 192kbps audio+video rate (see Apple's current +[HLS Authoring Specification][]). Removing the audio-only rate would of course +eliminate this problem since there would be only audio+video playlists to +choose from. + +Follow progress on this in issue [#175](https://github.com/videojs/http-streaming/issues/175). + +[HLS Authoring Specification]: https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices + +### DASH Assets with `$Time` Interpolation and `SegmentTimeline`s with No `t` + +DASH assets which use `$Time` in a `SegmentTemplate`, and also have a +`SegmentTimeline` where only the first `S` has a `t` and the rest only have a +`d`, do not load currently. + +There is currently no workaround for this, but you can track progress on this +in issue [#256](https://github.com/videojs/http-streaming/issues/256). + +## Testing + +For testing, you run `npm run test`. You will need Chrome and Firefox for running the tests. + +_videojs-http-streaming uses [BrowserStack](https://browserstack.com) for compatibility testing._ + +## Debugging + +videojs-http-streaming makes use of `videojs.log` for debug logging. You can enable these logs +by setting the log level to `debug` using `videojs.log.level('debug')`. You can access a complete +history of the logs using `videojs.log.history()`. This history is maintained even when the +log level is not set to `debug`. + +`vhs.stats` can also be helpful when debugging. Accessing this object will give you +a snapshot summary of various HLS and player stats. See [vhs.stats](#vhsstats) for details +about what this object contains. + +__NOTE__: The `debug` level is only available in video.js v6.6.0+. With earlier versions of +video.js, no debug messages will be logged to console. + +## Release History +Check out the [changelog](CHANGELOG.md) for a summary of each release. + +## Building +To build a copy of videojs-http-streaming run the following commands + +```bash +git clone https://github.com/videojs/http-streaming +cd http-streaming +npm i +npm run build +``` + +videojs-http-streaming will have created all of the files for using it in a dist folder + +## Development + +### Tools +* Download stream locally with the [HLS Fetcher](https://github.com/videojs/hls-fetcher) +* Simulate errors with [Murphy](https://github.com/videojs/murphy) +* Inspect content with [Thumbcoil](http://thumb.co.il) + +### Commands +All commands for development are listed in the `package.json` file and are run using +```bash +npm run +``` + +[slack-icon]: http://slack.videojs.com/badge.svg +[slack-link]: http://slack.videojs.com +[travis-icon]: https://travis-ci.org/videojs/http-streaming.svg?branch=main +[travis-link]: https://travis-ci.org/videojs/http-streaming +[issue-stats-link]: http://issuestats.com/github/videojs/http-streaming +[issue-stats-pr-icon]: http://issuestats.com/github/videojs/http-streaming/badge/pr +[issue-stats-issues-icon]: http://issuestats.com/github/videojs/http-streaming/badge/issue +[greenkeeper-icon]: https://badges.greenkeeper.io/videojs/http-streaming.svg +[greenkeeper-link]: https://greenkeeper.io/ diff --git a/webroot/test/index.html b/webroot/test/index.html new file mode 100644 index 000000000..054178a9f --- /dev/null +++ b/webroot/test/index.html @@ -0,0 +1,322 @@ + + + + + + Owncast Player Test + + + + + + + + + + + + + + + + + +
+
+
+ VideoJS (VHS) +
+ +
+ + Shaka (mux.js) +
+ +
+
+ + Clappr Player (hls.js) +
+ +
+ + Native HTML5 (Safari/iOS/Mac only) +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + +
+
+ Current Segment +
    +
    +
    +
    +
    +
    Current Time:
    +
    0
    +
    Buffered:
    +
    -
    +
    Video Buffered:
    +
    -
    +
    Audio Buffered:
    +
    -
    +
    Seekable:
    +
    + - - + - +
    +
    Video Bitrate:
    +
    0 kbps
    +
    Measured Bitrate:
    +
    0 kbps
    +
    Video Timestamp Offset
    +
    0
    +
    Audio Timestamp Offset
    +
    0
    +
    +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/webroot/test/old-index.html b/webroot/test/old-index.html new file mode 100644 index 000000000..6de834744 --- /dev/null +++ b/webroot/test/old-index.html @@ -0,0 +1,150 @@ + + + + + videojs-http-streaming Demo + + + + + + + +
    +
    + + +

    Options

    + +
    + + + + + + + + + + + + + +
    + +

    Load a URL

    + + + + + + + +

    Load a Source

    + +

    Navigation

    + + + + + + diff --git a/webroot/test/scripts/dash-manifest-object.json b/webroot/test/scripts/dash-manifest-object.json new file mode 100644 index 000000000..67ebc0c04 --- /dev/null +++ b/webroot/test/scripts/dash-manifest-object.json @@ -0,0 +1,3553 @@ +{ + "mediaGroups": { + "AUDIO": { + "audio": { + "default": { + "autoselect": true, + "default": true, + "language": "", + "uri": "combined-audio-playlists", + "playlists": [ + { + "attributes": { + "BANDWIDTH": 67071, + "CODECS": "mp4a.40.5" + }, + "segments": [ + { + "uri": "bbb_a64k/bbb_a64k_1.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_1.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 0 + }, + { + "uri": "bbb_a64k/bbb_a64k_2.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_2.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 1 + }, + { + "uri": "bbb_a64k/bbb_a64k_3.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_3.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 2 + }, + { + "uri": "bbb_a64k/bbb_a64k_4.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_4.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 3 + }, + { + "uri": "bbb_a64k/bbb_a64k_5.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_5.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 4 + }, + { + "uri": "bbb_a64k/bbb_a64k_6.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_6.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 5 + }, + { + "uri": "bbb_a64k/bbb_a64k_7.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_7.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 6 + }, + { + "uri": "bbb_a64k/bbb_a64k_8.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_8.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 7 + }, + { + "uri": "bbb_a64k/bbb_a64k_9.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_9.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 8 + }, + { + "uri": "bbb_a64k/bbb_a64k_10.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_10.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 9 + }, + { + "uri": "bbb_a64k/bbb_a64k_11.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_11.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 10 + }, + { + "uri": "bbb_a64k/bbb_a64k_12.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_12.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 11 + }, + { + "uri": "bbb_a64k/bbb_a64k_13.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_13.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 12 + }, + { + "uri": "bbb_a64k/bbb_a64k_14.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_14.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 13 + }, + { + "uri": "bbb_a64k/bbb_a64k_15.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_15.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 14 + }, + { + "uri": "bbb_a64k/bbb_a64k_16.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_16.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 15 + }, + { + "uri": "bbb_a64k/bbb_a64k_17.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_17.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 16 + }, + { + "uri": "bbb_a64k/bbb_a64k_18.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_18.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 17 + }, + { + "uri": "bbb_a64k/bbb_a64k_19.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_19.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 18 + }, + { + "uri": "bbb_a64k/bbb_a64k_20.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_20.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 19 + }, + { + "uri": "bbb_a64k/bbb_a64k_21.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_21.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 20 + }, + { + "uri": "bbb_a64k/bbb_a64k_22.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_22.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 21 + }, + { + "uri": "bbb_a64k/bbb_a64k_23.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_23.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 22 + }, + { + "uri": "bbb_a64k/bbb_a64k_24.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_24.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 23 + }, + { + "uri": "bbb_a64k/bbb_a64k_25.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_25.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 24 + }, + { + "uri": "bbb_a64k/bbb_a64k_26.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_26.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 25 + }, + { + "uri": "bbb_a64k/bbb_a64k_27.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_27.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 26 + }, + { + "uri": "bbb_a64k/bbb_a64k_28.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_28.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 27 + }, + { + "uri": "bbb_a64k/bbb_a64k_29.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_29.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 28 + }, + { + "uri": "bbb_a64k/bbb_a64k_30.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_30.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 29 + }, + { + "uri": "bbb_a64k/bbb_a64k_31.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_31.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 30 + }, + { + "uri": "bbb_a64k/bbb_a64k_32.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_32.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 31 + }, + { + "uri": "bbb_a64k/bbb_a64k_33.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_33.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 32 + }, + { + "uri": "bbb_a64k/bbb_a64k_34.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_34.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 33 + }, + { + "uri": "bbb_a64k/bbb_a64k_35.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_35.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 34 + }, + { + "uri": "bbb_a64k/bbb_a64k_36.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_36.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 35 + }, + { + "uri": "bbb_a64k/bbb_a64k_37.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_37.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 36 + }, + { + "uri": "bbb_a64k/bbb_a64k_38.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_38.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 37 + }, + { + "uri": "bbb_a64k/bbb_a64k_39.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_39.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 38 + }, + { + "uri": "bbb_a64k/bbb_a64k_40.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_40.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 39 + }, + { + "uri": "bbb_a64k/bbb_a64k_41.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_41.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 40 + }, + { + "uri": "bbb_a64k/bbb_a64k_42.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_42.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 41 + }, + { + "uri": "bbb_a64k/bbb_a64k_43.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_43.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 42 + }, + { + "uri": "bbb_a64k/bbb_a64k_44.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_44.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 43 + }, + { + "uri": "bbb_a64k/bbb_a64k_45.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_45.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 44 + }, + { + "uri": "bbb_a64k/bbb_a64k_46.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_46.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 45 + }, + { + "uri": "bbb_a64k/bbb_a64k_47.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_47.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 46 + }, + { + "uri": "bbb_a64k/bbb_a64k_48.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_48.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 47 + }, + { + "uri": "bbb_a64k/bbb_a64k_49.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_49.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 48 + }, + { + "uri": "bbb_a64k/bbb_a64k_50.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_50.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 49 + }, + { + "uri": "bbb_a64k/bbb_a64k_51.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_51.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 50 + }, + { + "uri": "bbb_a64k/bbb_a64k_52.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_52.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 51 + }, + { + "uri": "bbb_a64k/bbb_a64k_53.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_53.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 52 + }, + { + "uri": "bbb_a64k/bbb_a64k_54.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_54.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 53 + }, + { + "uri": "bbb_a64k/bbb_a64k_55.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_55.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 54 + }, + { + "uri": "bbb_a64k/bbb_a64k_56.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_56.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 55 + }, + { + "uri": "bbb_a64k/bbb_a64k_57.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_57.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 56 + }, + { + "uri": "bbb_a64k/bbb_a64k_58.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_58.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 57 + }, + { + "uri": "bbb_a64k/bbb_a64k_59.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_59.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 58 + }, + { + "uri": "bbb_a64k/bbb_a64k_60.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_60.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 59 + }, + { + "uri": "bbb_a64k/bbb_a64k_61.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_61.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 60 + }, + { + "uri": "bbb_a64k/bbb_a64k_62.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_62.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 61 + }, + { + "uri": "bbb_a64k/bbb_a64k_63.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_63.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 62 + }, + { + "uri": "bbb_a64k/bbb_a64k_64.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_64.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 63 + }, + { + "uri": "bbb_a64k/bbb_a64k_65.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_65.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 64 + }, + { + "uri": "bbb_a64k/bbb_a64k_66.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_66.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 65 + }, + { + "uri": "bbb_a64k/bbb_a64k_67.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_67.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 66 + }, + { + "uri": "bbb_a64k/bbb_a64k_68.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_68.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 67 + }, + { + "uri": "bbb_a64k/bbb_a64k_69.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_69.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 68 + }, + { + "uri": "bbb_a64k/bbb_a64k_70.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_70.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 69 + }, + { + "uri": "bbb_a64k/bbb_a64k_71.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_71.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 70 + }, + { + "uri": "bbb_a64k/bbb_a64k_72.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_72.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 71 + }, + { + "uri": "bbb_a64k/bbb_a64k_73.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_73.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 72 + }, + { + "uri": "bbb_a64k/bbb_a64k_74.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_74.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 73 + }, + { + "uri": "bbb_a64k/bbb_a64k_75.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_75.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 74 + }, + { + "uri": "bbb_a64k/bbb_a64k_76.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_76.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 75 + }, + { + "uri": "bbb_a64k/bbb_a64k_77.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_77.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 76 + }, + { + "uri": "bbb_a64k/bbb_a64k_78.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_78.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 77 + }, + { + "uri": "bbb_a64k/bbb_a64k_79.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_79.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 78 + }, + { + "uri": "bbb_a64k/bbb_a64k_80.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_80.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 79 + }, + { + "uri": "bbb_a64k/bbb_a64k_81.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_81.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 80 + }, + { + "uri": "bbb_a64k/bbb_a64k_82.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_82.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 81 + }, + { + "uri": "bbb_a64k/bbb_a64k_83.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_83.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 82 + }, + { + "uri": "bbb_a64k/bbb_a64k_84.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_84.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 83 + }, + { + "uri": "bbb_a64k/bbb_a64k_85.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_85.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 84 + }, + { + "uri": "bbb_a64k/bbb_a64k_86.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_86.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 85 + }, + { + "uri": "bbb_a64k/bbb_a64k_87.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_87.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 86 + }, + { + "uri": "bbb_a64k/bbb_a64k_88.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_88.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 87 + }, + { + "uri": "bbb_a64k/bbb_a64k_89.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_89.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 88 + }, + { + "uri": "bbb_a64k/bbb_a64k_90.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_90.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 89 + }, + { + "uri": "bbb_a64k/bbb_a64k_91.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_91.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 90 + }, + { + "uri": "bbb_a64k/bbb_a64k_92.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_92.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 91 + }, + { + "uri": "bbb_a64k/bbb_a64k_93.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_93.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 92 + }, + { + "uri": "bbb_a64k/bbb_a64k_94.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_94.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 93 + }, + { + "uri": "bbb_a64k/bbb_a64k_95.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_95.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 94 + }, + { + "uri": "bbb_a64k/bbb_a64k_96.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_96.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 95 + }, + { + "uri": "bbb_a64k/bbb_a64k_97.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_97.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 96 + }, + { + "uri": "bbb_a64k/bbb_a64k_98.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_98.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 97 + }, + { + "uri": "bbb_a64k/bbb_a64k_99.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_99.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 98 + }, + { + "uri": "bbb_a64k/bbb_a64k_100.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_100.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 99 + }, + { + "uri": "bbb_a64k/bbb_a64k_101.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_101.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 100 + }, + { + "uri": "bbb_a64k/bbb_a64k_102.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_102.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 101 + }, + { + "uri": "bbb_a64k/bbb_a64k_103.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_103.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 102 + }, + { + "uri": "bbb_a64k/bbb_a64k_104.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_104.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 103 + }, + { + "uri": "bbb_a64k/bbb_a64k_105.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_105.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 104 + }, + { + "uri": "bbb_a64k/bbb_a64k_106.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_106.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 105 + }, + { + "uri": "bbb_a64k/bbb_a64k_107.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_107.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 106 + }, + { + "uri": "bbb_a64k/bbb_a64k_108.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_108.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 107 + }, + { + "uri": "bbb_a64k/bbb_a64k_109.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_109.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 108 + }, + { + "uri": "bbb_a64k/bbb_a64k_110.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_110.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 109 + }, + { + "uri": "bbb_a64k/bbb_a64k_111.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_111.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 110 + }, + { + "uri": "bbb_a64k/bbb_a64k_112.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_112.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 111 + }, + { + "uri": "bbb_a64k/bbb_a64k_113.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_113.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 112 + }, + { + "uri": "bbb_a64k/bbb_a64k_114.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_114.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 113 + }, + { + "uri": "bbb_a64k/bbb_a64k_115.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_115.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 114 + }, + { + "uri": "bbb_a64k/bbb_a64k_116.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_116.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 115 + }, + { + "uri": "bbb_a64k/bbb_a64k_117.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_117.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 116 + }, + { + "uri": "bbb_a64k/bbb_a64k_118.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_118.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 117 + }, + { + "uri": "bbb_a64k/bbb_a64k_119.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_119.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 118 + }, + { + "uri": "bbb_a64k/bbb_a64k_120.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_120.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 119 + }, + { + "uri": "bbb_a64k/bbb_a64k_121.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_121.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 120 + }, + { + "uri": "bbb_a64k/bbb_a64k_122.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_122.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 121 + }, + { + "uri": "bbb_a64k/bbb_a64k_123.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_123.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 122 + }, + { + "uri": "bbb_a64k/bbb_a64k_124.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_124.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 123 + }, + { + "uri": "bbb_a64k/bbb_a64k_125.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_125.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 124 + }, + { + "uri": "bbb_a64k/bbb_a64k_126.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_126.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 125 + }, + { + "uri": "bbb_a64k/bbb_a64k_127.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_127.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 126 + }, + { + "uri": "bbb_a64k/bbb_a64k_128.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_128.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 127 + }, + { + "uri": "bbb_a64k/bbb_a64k_129.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_129.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 128 + }, + { + "uri": "bbb_a64k/bbb_a64k_130.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_130.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 129 + }, + { + "uri": "bbb_a64k/bbb_a64k_131.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_131.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 130 + }, + { + "uri": "bbb_a64k/bbb_a64k_132.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_132.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 131 + }, + { + "uri": "bbb_a64k/bbb_a64k_133.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_133.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 132 + }, + { + "uri": "bbb_a64k/bbb_a64k_134.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_134.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 133 + }, + { + "uri": "bbb_a64k/bbb_a64k_135.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_135.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 134 + }, + { + "uri": "bbb_a64k/bbb_a64k_136.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_136.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 135 + }, + { + "uri": "bbb_a64k/bbb_a64k_137.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_137.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 136 + }, + { + "uri": "bbb_a64k/bbb_a64k_138.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_138.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 137 + }, + { + "uri": "bbb_a64k/bbb_a64k_139.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_139.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 138 + }, + { + "uri": "bbb_a64k/bbb_a64k_140.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_140.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 139 + }, + { + "uri": "bbb_a64k/bbb_a64k_141.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_141.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 140 + }, + { + "uri": "bbb_a64k/bbb_a64k_142.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_142.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 141 + }, + { + "uri": "bbb_a64k/bbb_a64k_143.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_143.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 142 + }, + { + "uri": "bbb_a64k/bbb_a64k_144.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_144.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 143 + }, + { + "uri": "bbb_a64k/bbb_a64k_145.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_145.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 144 + }, + { + "uri": "bbb_a64k/bbb_a64k_146.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_146.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 145 + }, + { + "uri": "bbb_a64k/bbb_a64k_147.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_147.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 146 + }, + { + "uri": "bbb_a64k/bbb_a64k_148.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_148.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 147 + }, + { + "uri": "bbb_a64k/bbb_a64k_149.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_149.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 148 + }, + { + "uri": "bbb_a64k/bbb_a64k_150.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_150.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 149 + }, + { + "uri": "bbb_a64k/bbb_a64k_151.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_151.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 150 + }, + { + "uri": "bbb_a64k/bbb_a64k_152.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_152.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 151 + }, + { + "uri": "bbb_a64k/bbb_a64k_153.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_153.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 152 + }, + { + "uri": "bbb_a64k/bbb_a64k_154.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_154.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 153 + }, + { + "uri": "bbb_a64k/bbb_a64k_155.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_155.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 154 + }, + { + "uri": "bbb_a64k/bbb_a64k_156.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_156.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 155 + }, + { + "uri": "bbb_a64k/bbb_a64k_157.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_157.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 156 + }, + { + "uri": "bbb_a64k/bbb_a64k_158.m4a", + "timeline": 0, + "duration": 4.010666666666666, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_158.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 157 + }, + { + "uri": "bbb_a64k/bbb_a64k_159.m4a", + "timeline": 0, + "duration": 0.8806666666667979, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_159.m4a", + "map": { + "uri": "bbb_a64k/bbb_a64k_0.m4a", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_a64k/bbb_a64k_0.m4a" + }, + "number": 158 + } + ], + "uri": "combined-playlist-audio", + "resolvedUri": "combined-playlist-audio", + "playlistType": "VOD", + "targetDuration": 4.010666666666666, + "endList": true, + "mediaSequence": 0, + "discontinuitySequence": 0, + "discontinuityStarts": [] + } + ] + } + } + }, + "VIDEO": {}, + "CLOSED-CAPTIONS": {}, + "SUBTITLES": {} + }, + "uri": "http://localhost:10000/", + "playlists": [ + { + "attributes": { + "BANDWIDTH": 4952892, + "CODECS": "avc1.64001f", + "AUDIO": "audio" + }, + "segments": [ + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_1.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_1.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 0 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_2.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_2.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 1 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_3.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_3.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 2 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_4.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_4.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 3 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_5.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_5.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 4 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_6.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_6.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 5 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_7.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_7.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 6 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_8.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_8.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 7 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_9.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_9.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 8 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_10.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_10.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 9 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_11.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_11.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 10 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_12.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_12.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 11 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_13.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_13.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 12 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_14.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_14.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 13 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_15.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_15.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 14 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_16.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_16.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 15 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_17.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_17.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 16 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_18.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_18.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 17 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_19.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_19.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 18 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_20.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_20.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 19 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_21.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_21.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 20 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_22.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_22.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 21 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_23.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_23.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 22 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_24.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_24.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 23 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_25.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_25.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 24 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_26.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_26.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 25 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_27.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_27.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 26 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_28.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_28.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 27 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_29.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_29.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 28 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_30.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_30.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 29 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_31.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_31.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 30 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_32.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_32.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 31 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_33.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_33.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 32 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_34.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_34.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 33 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_35.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_35.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 34 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_36.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_36.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 35 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_37.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_37.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 36 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_38.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_38.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 37 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_39.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_39.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 38 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_40.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_40.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 39 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_41.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_41.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 40 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_42.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_42.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 41 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_43.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_43.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 42 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_44.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_44.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 43 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_45.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_45.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 44 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_46.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_46.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 45 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_47.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_47.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 46 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_48.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_48.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 47 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_49.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_49.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 48 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_50.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_50.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 49 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_51.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_51.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 50 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_52.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_52.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 51 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_53.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_53.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 52 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_54.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_54.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 53 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_55.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_55.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 54 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_56.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_56.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 55 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_57.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_57.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 56 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_58.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_58.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 57 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_59.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_59.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 58 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_60.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_60.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 59 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_61.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_61.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 60 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_62.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_62.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 61 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_63.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_63.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 62 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_64.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_64.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 63 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_65.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_65.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 64 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_66.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_66.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 65 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_67.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_67.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 66 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_68.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_68.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 67 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_69.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_69.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 68 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_70.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_70.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 69 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_71.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_71.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 70 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_72.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_72.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 71 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_73.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_73.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 72 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_74.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_74.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 73 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_75.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_75.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 74 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_76.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_76.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 75 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_77.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_77.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 76 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_78.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_78.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 77 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_79.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_79.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 78 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_80.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_80.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 79 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_81.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_81.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 80 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_82.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_82.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 81 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_83.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_83.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 82 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_84.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_84.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 83 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_85.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_85.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 84 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_86.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_86.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 85 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_87.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_87.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 86 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_88.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_88.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 87 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_89.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_89.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 88 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_90.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_90.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 89 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_91.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_91.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 90 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_92.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_92.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 91 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_93.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_93.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 92 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_94.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_94.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 93 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_95.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_95.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 94 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_96.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_96.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 95 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_97.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_97.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 96 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_98.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_98.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 97 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_99.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_99.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 98 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_100.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_100.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 99 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_101.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_101.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 100 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_102.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_102.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 101 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_103.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_103.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 102 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_104.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_104.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 103 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_105.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_105.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 104 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_106.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_106.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 105 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_107.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_107.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 106 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_108.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_108.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 107 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_109.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_109.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 108 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_110.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_110.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 109 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_111.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_111.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 110 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_112.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_112.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 111 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_113.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_113.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 112 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_114.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_114.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 113 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_115.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_115.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 114 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_116.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_116.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 115 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_117.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_117.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 116 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_118.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_118.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 117 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_119.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_119.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 118 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_120.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_120.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 119 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_121.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_121.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 120 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_122.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_122.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 121 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_123.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_123.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 122 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_124.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_124.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 123 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_125.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_125.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 124 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_126.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_126.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 125 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_127.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_127.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 126 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_128.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_128.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 127 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_129.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_129.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 128 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_130.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_130.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 129 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_131.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_131.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 130 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_132.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_132.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 131 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_133.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_133.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 132 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_134.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_134.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 133 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_135.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_135.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 134 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_136.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_136.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 135 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_137.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_137.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 136 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_138.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_138.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 137 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_139.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_139.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 138 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_140.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_140.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 139 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_141.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_141.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 140 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_142.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_142.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 141 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_143.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_143.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 142 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_144.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_144.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 143 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_145.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_145.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 144 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_146.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_146.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 145 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_147.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_147.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 146 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_148.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_148.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 147 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_149.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_149.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 148 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_150.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_150.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 149 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_151.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_151.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 150 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_152.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_152.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 151 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_153.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_153.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 152 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_154.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_154.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 153 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_155.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_155.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 154 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_156.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_156.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 155 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_157.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_157.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 156 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_158.m4v", + "timeline": 0, + "duration": 4, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_158.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 157 + }, + { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_159.m4v", + "timeline": 0, + "duration": 2.566000000000031, + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_159.m4v", + "map": { + "uri": "bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v", + "resolvedUri": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps_1280x720_4000k/bbb_30fps_1280x720_4000k_0.m4v" + }, + "number": 158 + } + ], + "uri": "combined-playlist", + "resolvedUri": "combined-playlist", + "playlistType": "VOD", + "targetDuration": 4, + "endList": true, + "mediaSequence": 0, + "discontinuitySequence": 0, + "discontinuityStarts": [] + } + ] +} diff --git a/webroot/test/scripts/hls-manifest-object.json b/webroot/test/scripts/hls-manifest-object.json new file mode 100644 index 000000000..5ef28f693 --- /dev/null +++ b/webroot/test/scripts/hls-manifest-object.json @@ -0,0 +1,380 @@ +{ + "mediaGroups": { + "AUDIO": { + "audio": { + "default": { + "autoselect": true, + "default": true, + "language": "", + "uri": "combined-audio-playlists", + "playlists": [ + { + "attributes": {}, + "segments": [ + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s1.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s1.mp4", + "number": 0 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s2.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s2.mp4", + "number": 1 + }, + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s3.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s3.mp4", + "number": 2 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s4.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s4.mp4", + "number": 3 + }, + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s5.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s5.mp4", + "number": 4 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s6.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s6.mp4", + "number": 5 + }, + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s7.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s7.mp4", + "number": 6 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s8.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s8.mp4", + "number": 7 + }, + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s9.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s9.mp4", + "number": 8 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s10.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s10.mp4", + "number": 9 + }, + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s11.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s11.mp4", + "number": 10 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s12.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s12.mp4", + "number": 11 + }, + { + "duration": 4.011, + "uri": "a-eng-0128k-aac-2c-s13.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s13.mp4", + "number": 12 + }, + { + "duration": 3.989, + "uri": "a-eng-0128k-aac-2c-s14.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s14.mp4", + "number": 13 + }, + { + "duration": 4, + "uri": "a-eng-0128k-aac-2c-s15.mp4", + "timeline": 0, + "map": { + "uri": "a-eng-0128k-aac-2c-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/a-eng-0128k-aac-2c-s15.mp4", + "number": 14 + } + ], + "uri": "combined-playlist-audio", + "resolvedUri": "combined-playlist-audio", + "playlistType": "VOD", + "endList": true, + "mediaSequence": 0, + "discontinuitySequence": 0, + "discontinuityStarts": [] + } + ] + } + } + }, + "VIDEO": {}, + "CLOSED-CAPTIONS": {}, + "SUBTITLES": {} + }, + "uri": "http://localhost:10000/", + "playlists": [ + { + "attributes": { + "BANDWIDTH": 8062646, + "CODECS": "avc1.4d401f,mp4a.40.2", + "AUDIO": "audio" + }, + "segments": [ + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s1.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s1.mp4", + "number": 0 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s2.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s2.mp4", + "number": 1 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s3.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s3.mp4", + "number": 2 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s4.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s4.mp4", + "number": 3 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s5.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s5.mp4", + "number": 4 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s6.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s6.mp4", + "number": 5 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s7.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s7.mp4", + "number": 6 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s8.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s8.mp4", + "number": 7 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s9.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s9.mp4", + "number": 8 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s10.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s10.mp4", + "number": 9 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s11.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s11.mp4", + "number": 10 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s12.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s12.mp4", + "number": 11 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s13.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s13.mp4", + "number": 12 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s14.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s14.mp4", + "number": 13 + }, + { + "duration": 4, + "uri": "v-0576p-1400k-libx264-s15.mp4", + "timeline": 0, + "map": { + "uri": "v-0576p-1400k-libx264-init.mp4", + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-init.mp4" + }, + "resolvedUri": "https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/v-0576p-1400k-libx264-s15.mp4", + "number": 14 + } + ], + "uri": "combined-playlist", + "resolvedUri": "combined-playlist", + "playlistType": "VOD", + "endList": true, + "mediaSequence": 0, + "discontinuitySequence": 0, + "discontinuityStarts": [] + } + ] +} diff --git a/webroot/test/scripts/index.js b/webroot/test/scripts/index.js new file mode 100644 index 000000000..61d77c8f6 --- /dev/null +++ b/webroot/test/scripts/index.js @@ -0,0 +1,768 @@ +/* global window document */ +/* eslint-disable vars-on-top, no-var, object-shorthand, no-console */ +(function (window) { + var representationsEl = document.getElementById('representations'); + + representationsEl.addEventListener('change', function () { + var selectedIndex = representationsEl.selectedIndex; + + if (!selectedIndex || selectedIndex < 1 || !window.vhs) { + return; + } + var selectedOption = + representationsEl.options[representationsEl.selectedIndex]; + + if (!selectedOption) { + return; + } + + var id = selectedOption.value; + + window.vhs.representations().forEach(function (rep) { + rep.playlist.disabled = rep.id !== id; + }); + + window.mpc.fastQualityChange_(); + }); + var isManifestObjectType = function (url) { + return /application\/vnd\.videojs\.vhs\+json/.test(url); + }; + var hlsOptGroup = document.querySelector('[label="hls"]'); + var dashOptGroup = document.querySelector('[label="dash"]'); + var drmOptGroup = document.querySelector('[label="drm"]'); + var liveOptGroup = document.querySelector('[label="live"]'); + var llliveOptGroup = document.querySelector('[label="low latency live"]'); + var manifestOptGroup = document.querySelector( + '[label="json manifest object"]' + ); + + var sourceList; + var hlsDataManifest; + var dashDataManifest; + + var addSourcesToDom = function () { + if (!sourceList || !hlsDataManifest || !dashDataManifest) { + return; + } + + sourceList.forEach(function (source) { + var option = document.createElement('option'); + + option.innerText = source.name; + option.value = source.uri; + + if (source.keySystems) { + option.setAttribute( + 'data-key-systems', + JSON.stringify(source.keySystems, null, 2) + ); + } + + if (source.mimetype) { + option.setAttribute('data-mimetype', source.mimetype); + } + + if (source.features.indexOf('live') !== -1) { + liveOptGroup.appendChild(option); + } else if (source.mimetype === 'application/x-mpegurl') { + hlsOptGroup.appendChild(option); + } + }); + + var hlsOption = document.createElement('option'); + var dashOption = document.createElement('option'); + + dashOption.innerText = + 'Dash Manifest Object Test, does not survive page reload'; + dashOption.value = `data:application/vnd.videojs.vhs+json,${dashDataManifest}`; + hlsOption.innerText = + 'HLS Manifest Object Test, does not survive page reload'; + hlsOption.value = `data:application/vnd.videojs.vhs+json,${hlsDataManifest}`; + + // manifestOptGroup.appendChild(hlsOption); + // manifestOptGroup.appendChild(dashOption); + }; + + var sourcesXhr = new window.XMLHttpRequest(); + + sourcesXhr.addEventListener('load', function () { + sourceList = JSON.parse(sourcesXhr.responseText); + addSourcesToDom(); + }); + sourcesXhr.open('GET', './scripts/sources.json'); + sourcesXhr.send(); + + var hlsManifestXhr = new window.XMLHttpRequest(); + + hlsManifestXhr.addEventListener('load', function () { + hlsDataManifest = hlsManifestXhr.responseText; + addSourcesToDom(); + }); + hlsManifestXhr.open('GET', './scripts/hls-manifest-object.json'); + hlsManifestXhr.send(); + + var dashManifestXhr = new window.XMLHttpRequest(); + + dashManifestXhr.addEventListener('load', function () { + dashDataManifest = dashManifestXhr.responseText; + addSourcesToDom(); + }); + dashManifestXhr.open('GET', './scripts/dash-manifest-object.json'); + dashManifestXhr.send(); + + // all relevant elements + var urlButton = document.getElementById('load-url'); + var sources = document.getElementById('load-source'); + var stateEls = {}; + + var getInputValue = function (el) { + if ( + el.type === 'url' || + el.type === 'text' || + el.nodeName.toLowerCase() === 'textarea' + ) { + if (isManifestObjectType(el.value)) { + return ''; + } + return encodeURIComponent(el.value); + } else if (el.type === 'select-one') { + return el.options[el.selectedIndex].value; + } else if (el.type === 'checkbox') { + return el.checked; + } + + console.warn('unhandled input type ' + el.type); + return ''; + }; + + var setInputValue = function (el, value) { + if ( + el.type === 'url' || + el.type === 'text' || + el.nodeName.toLowerCase() === 'textarea' + ) { + el.value = decodeURIComponent(value); + } else if (el.type === 'select-one') { + for (var i = 0; i < el.options.length; i++) { + if (el.options[i].value === value) { + el.options[i].selected = true; + } + } + } else { + // get the `value` into a Boolean. + el.checked = JSON.parse(value); + } + }; + + var newEvent = function (name) { + var event; + + if (typeof window.Event === 'function') { + event = new window.Event(name); + } else { + event = document.createEvent('Event'); + event.initEvent(name, true, true); + } + + return event; + }; + + // taken from video.js + var getFileExtension = function (path) { + var splitPathRe; + var pathParts; + + if (typeof path === 'string') { + splitPathRe = + /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]*?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i; + pathParts = splitPathRe.exec(path); + + if (pathParts) { + return pathParts.pop().toLowerCase(); + } + } + + return ''; + }; + + var saveState = function () { + var query = ''; + + if (!window.history.replaceState) { + return; + } + + Object.keys(stateEls).forEach(function (elName) { + var symbol = query.length ? '&' : '?'; + + query += symbol + elName + '=' + getInputValue(stateEls[elName]); + }); + + window.history.replaceState({}, 'vhs demo', query); + }; + + window.URLSearchParams = + window.URLSearchParams || + function (locationSearch) { + this.get = function (name) { + var results = new RegExp('[?&]' + name + '=([^&#]*)').exec( + locationSearch + ); + + return results ? decodeURIComponent(results[1]) : null; + }; + }; + + // eslint-disable-next-line + var loadState = function () { + var params = new window.URLSearchParams(window.location.search); + + return Object.keys(stateEls).reduce(function (acc, elName) { + acc[elName] = + typeof params.get(elName) !== 'object' + ? params.get(elName) + : getInputValue(stateEls[elName]); + return acc; + }, {}); + }; + + // eslint-disable-next-line + var reloadScripts = function (urls, cb) { + console.log('blah') + var el = document.getElementById('reload-scripts'); + + if (!el) { + el = document.createElement('div'); + el.id = 'reload-scripts'; + document.body.appendChild(el); + } + + while (el.firstChild) { + el.removeChild(el.firstChild); + } + + var loaded = []; + + var checkDone = function () { + if (loaded.length === urls.length) { + cb(); + } + }; + + urls.forEach(function (url) { + console.log(url) + var script = document.createElement('script'); + + // scripts marked as defer will be loaded asynchronously but will be executed in the order they are in the DOM + script.defer = true; + // dynamically created scripts are async by default unless otherwise specified + // async scripts are loaded asynchronously but also executed as soon as they are loaded + // we want to load them in the order they are added therefore we want to turn off async + script.async = false; + script.src = url; + script.onload = function () { + loaded.push(url); + checkDone(); + }; + el.appendChild(script); + }); + + }; + + var regenerateRepresentations = function () { + while (representationsEl.firstChild) { + representationsEl.removeChild(representationsEl.firstChild); + } + + var selectedIndex; + + window.vhs.representations().forEach(function (rep, i) { + var option = document.createElement('option'); + + option.value = rep.id; + option.innerText = JSON.stringify({ + id: rep.id, + videoCodec: rep.codecs.video, + audioCodec: rep.codecs.audio, + bandwidth: rep.bandwidth, + heigth: rep.heigth, + width: rep.width, + }); + + if (window.mpc.media().id === rep.id) { + selectedIndex = i; + } + + representationsEl.appendChild(option); + }); + + representationsEl.selectedIndex = selectedIndex; + }; + + function getBuffered(buffered) { + var bufferedText = ''; + + if (!buffered) { + return bufferedText; + } + + if (buffered.length) { + bufferedText += buffered.start(0) + ' - ' + buffered.end(0); + } + for (var i = 1; i < buffered.length; i++) { + bufferedText += ', ' + buffered.start(i) + ' - ' + buffered.end(i); + } + return bufferedText; + } + + var setupSegmentMetadata = function (player) { + // setup segment metadata + var segmentMetadata = document.querySelector('#segment-metadata'); + + player.one('loadedmetadata', function () { + var tracks = player.textTracks(); + var segmentMetadataTrack; + + for (var i = 0; i < tracks.length; i++) { + if (tracks[i].label === 'segment-metadata') { + segmentMetadataTrack = tracks[i]; + } + } + + while (segmentMetadata.children.length) { + segmentMetadata.removeChild(segmentMetadata.firstChild); + } + + if (segmentMetadataTrack) { + segmentMetadataTrack.addEventListener('cuechange', function () { + var cues = segmentMetadataTrack.activeCues || []; + + let activeCue = segmentMetadataTrack.activeCues[0].value; + + try { + const latency = + (new Date().getTime() - activeCue.dateTimeObject.getTime()) / + 1000; + document.getElementById('displayedSegmentLatency').innerHTML = + latency; + } catch (err) { + console.error(err); + } + + while (segmentMetadata.children.length) { + segmentMetadata.removeChild(segmentMetadata.firstChild); + } + + for (var j = 0; j < cues.length; j++) { + var text = JSON.stringify(JSON.parse(cues[j].text), null, 2); + var li = document.createElement('li'); + var pre = document.createElement('pre'); + + pre.classList.add('border', 'rounded', 'p-2'); + pre.textContent = text; + li.appendChild(pre); + segmentMetadata.appendChild(li); + } + }); + } + }); + }; + + var setupPlayerStats = function (player) { + player.on('dispose', () => { + if (window.statsTimer) { + window.clearInterval(window.statsTimer); + window.statsTimer = null; + } + }); + var currentTimeStat = document.querySelector('.current-time-stat'); + var bufferedStat = document.querySelector('.buffered-stat'); + var videoBufferedStat = document.querySelector('.video-buffered-stat'); + var audioBufferedStat = document.querySelector('.audio-buffered-stat'); + var seekableStartStat = document.querySelector('.seekable-start-stat'); + var seekableEndStat = document.querySelector('.seekable-end-stat'); + var videoBitrateState = document.querySelector('.video-bitrate-stat'); + var measuredBitrateStat = document.querySelector('.measured-bitrate-stat'); + var videoTimestampOffset = document.querySelector('.video-timestampoffset'); + var audioTimestampOffset = document.querySelector('.audio-timestampoffset'); + + player.on('timeupdate', function () { + currentTimeStat.textContent = player.currentTime().toFixed(1); + }); + + window.statsTimer = window.setInterval(function () { + var oldStart; + var oldEnd; + var seekable = player.seekable(); + + if (seekable && seekable.length) { + oldStart = seekableStartStat.textContent; + if (seekable.start(0).toFixed(1) !== oldStart) { + seekableStartStat.textContent = seekable.start(0).toFixed(1); + } + oldEnd = seekableEndStat.textContent; + if (seekable.end(0).toFixed(1) !== oldEnd) { + seekableEndStat.textContent = seekable.end(0).toFixed(1); + } + } + + // buffered + bufferedStat.textContent = getBuffered(player.buffered()); + + // exit early if no VHS + if (!player.tech(true).vhs) { + videoBufferedStat.textContent = ''; + audioBufferedStat.textContent = ''; + videoBitrateState.textContent = ''; + measuredBitrateStat.textContent = ''; + videoTimestampOffset.textContent = ''; + audioTimestampOffset.textContent = ''; + return; + } + + videoBufferedStat.textContent = getBuffered( + player.tech(true).vhs.masterPlaylistController_.mainSegmentLoader_ + .sourceUpdater_.videoBuffer && + player.tech(true).vhs.masterPlaylistController_.mainSegmentLoader_ + .sourceUpdater_.videoBuffer.buffered + ); + + // demuxed audio + var audioBuffer = getBuffered( + player.tech(true).vhs.masterPlaylistController_.audioSegmentLoader_ + .sourceUpdater_.audioBuffer && + player.tech(true).vhs.masterPlaylistController_.audioSegmentLoader_ + .sourceUpdater_.audioBuffer.buffered + ); + + // muxed audio + if (!audioBuffer) { + audioBuffer = getBuffered( + player.tech(true).vhs.masterPlaylistController_.mainSegmentLoader_ + .sourceUpdater_.audioBuffer && + player.tech(true).vhs.masterPlaylistController_.mainSegmentLoader_ + .sourceUpdater_.audioBuffer.buffered + ); + } + audioBufferedStat.textContent = audioBuffer; + + if ( + player.tech(true).vhs.masterPlaylistController_.audioSegmentLoader_ + .sourceUpdater_.audioBuffer + ) { + audioTimestampOffset.textContent = + player.tech( + true + ).vhs.masterPlaylistController_.audioSegmentLoader_.sourceUpdater_.audioBuffer.timestampOffset; + } else if ( + player.tech(true).vhs.masterPlaylistController_.mainSegmentLoader_ + .sourceUpdater_.audioBuffer + ) { + audioTimestampOffset.textContent = + player.tech( + true + ).vhs.masterPlaylistController_.mainSegmentLoader_.sourceUpdater_.audioBuffer.timestampOffset; + } + + if ( + player.tech(true).vhs.masterPlaylistController_.mainSegmentLoader_ + .sourceUpdater_.videoBuffer + ) { + videoTimestampOffset.textContent = + player.tech( + true + ).vhs.masterPlaylistController_.mainSegmentLoader_.sourceUpdater_.videoBuffer.timestampOffset; + } + + // bitrates + var playlist = player.tech_.vhs.playlists.media(); + + if (playlist && playlist.attributes && playlist.attributes.BANDWIDTH) { + videoBitrateState.textContent = + (playlist.attributes.BANDWIDTH / 1024).toLocaleString(undefined, { + maximumFractionDigits: 1, + }) + ' kbps'; + } + if (player.tech_.vhs.bandwidth) { + measuredBitrateStat.textContent = + (player.tech_.vhs.bandwidth / 1024).toLocaleString(undefined, { + maximumFractionDigits: 1, + }) + ' kbps'; + } + }, 100); + }; + + [ + 'debug', + 'autoplay', + 'muted', + 'fluid', + 'minified', + 'sync-workers', + 'liveui', + 'llhls', + 'url', + 'type', + 'buffer-water', + 'exact-manifest-timings', + 'pixel-diff-selector', + 'override-native', + 'preload', + 'mirror-source', + ].forEach(function (name) { + stateEls[name] = document.getElementById(name); + }); + + window.startDemo = function (cb) { + var state = loadState(); + + Object.keys(state).forEach(function (elName) { + setInputValue(stateEls[elName], state[elName]); + }); + + Array.prototype.forEach.call(sources.options, function (s, i) { + if (s.value === state.url) { + sources.selectedIndex = i; + } + }); + + // stateEls that reload the player and scripts + [ + 'mirror-source', + 'sync-workers', + 'preload', + 'llhls', + 'buffer-water', + 'override-native', + 'liveui', + 'pixel-diff-selector', + 'exact-manifest-timings', + ].forEach(function (name) { + stateEls[name].addEventListener('change', function (event) { + saveState(); + + stateEls.minified.dispatchEvent(newEvent('change')); + }); + }); + + stateEls.debug.addEventListener('change', function (event) { + saveState(); + window.videojs.log.level(event.target.checked ? 'debug' : 'info'); + }); + + stateEls.minified.addEventListener('change', function (event) { + // let urls = []; + var urls = [].map(function (url) { + return url + (event.target.checked ? '.min' : '') + '.js'; + }); + + // if (stateEls['sync-workers'].checked) { + // urls.push('dist/videojs-http-streaming-sync-workers.js'); + // } else { + urls.push( + 'https://vjs.zencdn.net/7.15.4/video.min.js', + 'https://cdn.jsdelivr.net/npm/@videojs/http-streaming@2.10.3/dist/videojs-http-streaming.min.js' + ); + // } + + saveState(); + + if (window.player) { + window.player.dispose(); + delete window.player; + } + if (window.videojs) { + delete window.videojs; + } + + reloadScripts(urls, function () { + console.log('reloadScripts') + var player; + var fixture = document.getElementById('player-fixture'); + var videoEl = document.createElement('video-js'); + + videoEl.setAttribute('controls', ''); + videoEl.setAttribute('preload', 'auto'); + videoEl.setAttribute('autoplay', ''); + videoEl.setAttribute('muted', ''); + videoEl.setAttribute('fluid', 'true'); + + videoEl.className = 'vjs-default-skin'; + fixture.appendChild(videoEl); + + player = window.player = window.videojs(videoEl, { + html5: { + vhs: { + overrideNative: true, + experimentalBufferBasedABR: getInputValue( + stateEls['buffer-water'] + ), + experimentalExactManifestTimings: getInputValue( + stateEls['exact-manifest-timings'] + ), + experimentalLeastPixelDiffSelector: getInputValue( + stateEls['pixel-diff-selector'] + ), + }, + }, + }); + + window.player = player; + + setupPlayerStats(player); + setupSegmentMetadata(player); + + // save player muted state interation + player.on('volumechange', function () { + if (stateEls.muted.checked !== player.muted()) { + stateEls.muted.checked = player.muted(); + saveState(); + } + }); + + player.on('sourceset', function () { + var source = player.currentSource(); + + if (source.keySystems) { + var copy = JSON.parse(JSON.stringify(source.keySystems)); + + // have to delete pssh as it will often make keySystems too big + // for a uri + Object.keys(copy).forEach(function (key) { + if (copy[key].hasOwnProperty('pssh')) { + delete copy[key].pssh; + } + }); + + stateEls.keysystems.value = JSON.stringify(copy, null, 2); + } + + if (source.src) { + stateEls.url.value = encodeURI(source.src); + } + + if (source.type) { + stateEls.type.value = source.type; + } + + saveState(); + }); + + player.width(640); + player.height(264); + + stateEls.debug.dispatchEvent(newEvent('change')); + stateEls.muted.dispatchEvent(newEvent('change')); + stateEls.fluid.dispatchEvent(newEvent('change')); + stateEls.autoplay.dispatchEvent(newEvent('change')); + + // run the load url handler for the intial source + if (stateEls.url.value) { + urlButton.dispatchEvent(newEvent('click')); + } else { + sources.dispatchEvent(newEvent('change')); + } + player.on('loadedmetadata', function () { + if (player.tech_.vhs) { + window.vhs = player.tech_.vhs; + window.mpc = player.tech_.vhs.masterPlaylistController_; + window.mpc.masterPlaylistLoader_.on( + 'mediachange', + regenerateRepresentations + ); + regenerateRepresentations(); + } else { + window.vhs = null; + window.mpc = null; + } + }); + cb(player); + }); + }); + + var urlButtonClick = function (event) { + var ext; + var type = stateEls.type.value; + + // reset type if it's a manifest object's type + if (type === 'application/vnd.videojs.vhs+json') { + type = ''; + } + + if (isManifestObjectType(stateEls.url.value)) { + type = 'application/vnd.videojs.vhs+json'; + } + + if (!type.trim()) { + ext = getFileExtension(stateEls.url.value); + + if (ext === 'mpd') { + type = 'application/dash+xml'; + } else if (ext === 'm3u8') { + type = 'application/x-mpegURL'; + } + } + + saveState(); + + var source = { + src: stateEls.url.value, + type: type, + }; + + sources.selectedIndex = -1; + + Array.prototype.forEach.call(sources.options, function (s, i) { + if (s.value === stateEls.url.value) { + sources.selectedIndex = i; + } + }); + + window.player.src(source); + const src = source.src; + window.currentSrc = src; + + window.shaka.load(src); + window.clapprPlayer.load(src); + const nativePlayer = document.getElementById('native-player'); + nativePlayer.setAttribute('src', src); + }; + + urlButton.addEventListener('click', urlButtonClick); + urlButton.addEventListener('tap', urlButtonClick); + + sources.addEventListener('change', function (event) { + var selectedOption = sources.options[sources.selectedIndex]; + + if (!selectedOption) { + return; + } + var src = selectedOption.value; + + stateEls.url.value = src; + stateEls.type.value = selectedOption.getAttribute('data-mimetype'); + // stateEls.keysystems.value = selectedOption.getAttribute('data-key-systems'); + + urlButton.dispatchEvent(newEvent('click')); + }); + + stateEls.url.addEventListener('keyup', function (event) { + if (event.key === 'Enter') { + urlButton.click(); + } + }); + stateEls.url.addEventListener('input', function (event) { + if (stateEls.type.value.length) { + stateEls.type.value = ''; + } + }); + stateEls.type.addEventListener('keyup', function (event) { + if (event.key === 'Enter') { + urlButton.click(); + } + }); + + // run the change handler for the first time + stateEls.minified.dispatchEvent(newEvent('change')); + }; +})(window); diff --git a/webroot/test/scripts/sources.json b/webroot/test/scripts/sources.json new file mode 100644 index 000000000..0c602e1fd --- /dev/null +++ b/webroot/test/scripts/sources.json @@ -0,0 +1,76 @@ +[ + { + "name": "This Owncast instance", + "uri": "/hls/stream.m3u8", + "mimetype": "application/x-mpegurl", + "features": ["live"] + }, + { + "name": "Owncast Demo Server", + "uri": "https://watch.owncast.online/hls/stream.m3u8", + "mimetype": "application/x-mpegurl", + "features": ["live"] + }, + { + "name": "Big Buck Bunny - Adaptive", + "uri": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "Bipbop - Muxed TS with 1 alt Audio, 5 captions", + "uri": "https://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "Coit Tower drone footage - 4 8 second segment", + "uri": "https://d2zihajmogu5jn.cloudfront.net/CoitTower/master_ts_segtimes.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "Boat Video Only", + "uri": "https://d2zihajmogu5jn.cloudfront.net/video-only/out.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "Boat Misaligned - 3, 5, 7, second segment playlists", + "uri": "https://d2zihajmogu5jn.cloudfront.net/misaligned-playlists/master.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "BBB-CMIF: Big Buck Bunny Dark Truths - demuxed, fmp4", + "uri": "https://storage.googleapis.com/shaka-demo-assets/bbb-dark-truths-hls/hls.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "Pseudo-Live PDT test source", + "uri": "https://d2zihajmogu5jn.cloudfront.net/pdt-test-source/no-endlist.m3u8", + "mimetype": "application/x-mpegurl", + "features": [ + "live" + ] + }, + { + "name": "PDT test source", + "uri": "https://d2zihajmogu5jn.cloudfront.net/pdt-test-source/endlist.m3u8", + "mimetype": "application/x-mpegurl", + "features": [] + }, + { + "name": "audio only dash, two groups", + "uri": "https://d2zihajmogu5jn.cloudfront.net/audio-only-dash/dash.mpd", + "mimetype": "application/dash+xml", + "features": [] + }, + { + "name": "video only dash, two renditions", + "uri": "https://d2zihajmogu5jn.cloudfront.net/video-only-dash/dash.mpd", + "mimetype": "application/dash+xml", + "features": [] + } +] \ No newline at end of file