Dash in Accurate Video

Accurate Video can be used to play Dash content by leveraging shaka-player. With this comes capabilities to play DRM-protected content. In the following sections we'll go through how to configure Accurate Video and ingest content in order to take advantage of these features.

Ingest content in Accurate Video

In order to extract metadata needed for frame accurate seeking etc, generating thumbnails and waveforms,

it's required that a progressive "original" file is ingested to the asset alongside with the Dash manifest. The original should be tagged (setting metadata field with key "tag") with "Original" and can then only be accessed by superuser or users with the role "read_original" assigned.

To ingest the Dash content you only need to ingest the manifest (.mpd)

file. Segments should be stored on the same bucket as the manifest file and be referenced relative from the manifest.

Using the API

When ingesting using the API you should leverage the "skip_transcode" parameter to avoid a proxy for the original file.


Lets say we have two files in a storage with id "123" which is the original file and "1234" which is the manifest of the Dash representation. Then to ingest these two files to a fresh asset you would post

>curl -X POST -H "Content-Type: application/json" "https://av.backend.com/asset?skip_transcode=true" -d '{"fileIds": [{"123", "1234"}]}'

Mapping audio between original and Dash manifest.

Accurate Video support multiple muxed audio tracks in the dash manifest and these can be activated from the media tab.

However, in order to generate waveform for each track, we require that the original video file have the audio tracks muxed in the same order as they occur in the manifest.

Stream the right proxy

It is currently not supported to toggle between proxies of mixed progressive and Dash/HLS content. This implies that if there are two proxies, one progressive and one Dash type and the progressive is loaded first it is not possible to stream the Dash proxy in this instance. To control which proxy is loaded initialy it's crusial that each proxy have distinct tag metadata value set. Which tag is loaded initially can then be controled by the frontend-setting property preferredVideoShapes.

Configuring DRM.

DRM is handled through shaka-player. This means that Accurate Video has the same abilities/limitations as shaka-player.


Providing a license server.

The license acquisition url needed to configure DRM playback can be provided in two main ways, either statically through the settings file or a unique value can be set for each file through metadata.

Configure through settings

There are two ways to provide license acquisition url in Accurate Video, either by configuring

the drm.servers section of the frontend setting i.e:


⠀drm: {
⠀⠀servers: {
⠀⠀⠀'com.widevinde.alpha': 'https://foo.bar/drm/widevine',

This will make Accurate Video to use the configured license server whenever it opens any Dash content.

Configure through File metadata

Another approach is to set a metadata field on the `FileDto` (preferably at ingest) with a key prefixed with `av:server:`. This approach allows for a individual license url for every file.


If we have the current metadata of a manifest file ingested in Accurate Video

> curl https://backend.com/file/123/metadata | jq

⠀⠀"creationDate": "2020-12-14T14:37:28.522859Z",
⠀⠀"updateDate": "2020-12-14T14:37:28.522859Z",
⠀⠀"version": 0,
⠀⠀"id": "2027400",
⠀⠀"key": "av:server:com.widevine.alpha",
⠀⠀"value": "https://foo.bar/drm/widevine/file123specific"

The metadata above will result in the following drm setting for that specific file:

drm: {
⠀servers: {
⠀⠀'com.widevine.alpha': "https://foo.bar/drm/widevine/file123specific"

Additional authentication

Through the frontend `settings.js` it is possible to configure a custom requestFilter to register for the shaka-player instance.


If we need to specify an additional authentication header "customdata" to all license requests made from shaka-player we could add the following setting:

drm: {
⠀streamingInterceptor: (data) => {
⠀⠀return (type, request) => {
⠀⠀⠀if (type === 2) {
⠀⠀⠀⠀request.headers.customdata = data;
⠀fileSecretKey: "custom_data"

Automatic Ingest Accurate.Video job templates