Integrate Studio DRM Standalone with your Cast-enable device.
The Google Cast framework enables a viewer to stream video and audio content to a compatible TV or sound system. By enabling the Google Cast framework in your app, a viewer can use a cast button to stream your content to a Cast-enabled device on a shared network connection.
Basic setup
In order to stream DRM-protected content on a Cast-enabled device, you must create a Cast app. The Cast app consists of two parts: a Sender app and a Receiver app.
The Sender app is part of either the web page or your chosen player that sets up the load function.
load(url, token, laUrl) {
if (player.isConnected) { return };
let mediaInfo = new chrome.cast.media.MediaInfo(url);
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;
mediaInfo.metadata.title = 'Studio DRM Demo';
mediaInfo.customData = { laUrl, token };
let request = new chrome.cast.media.LoadRequest(mediaInfo);
request.autoplay = true;
request.currentTime = 0;
cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).catch((error) => {
console.error(error);
});
}
The Receiver app is hosted by you, must be registered with Google, and manages the communication between the Sender app and the Cast device.
let videoElement = document.getElementById("your-video-element");
if (event.data.media && event.data.media.contentId){
let url = event.data.media.contentId;
let initStart = event.data.media.currentTime || 0;
let autoplay = !!event.data.autoplay;
let customData = event.data.media.customData || {};
let host = new cast.player.api.Host({mediaElement:videoElement, url});
let protocol = cast.player.api.CreateDashStreamingProtocol(host);
let player = new cast.player.api.Player(host);
player.load(protocol, initStart);
host.onError = (errorCode) => {
console.error('Fatal Error ' + errorCode);
if (player) {
player.unload();
player = null;
}
}
MPEG-DASH overrides
host.protectionSystem = cast.player.api.ContentProtection.WIDEVINE;
host.licenseUrl = 'https://widevine-license.vudrm.tech/proxy';
host.processManifest = (manifest) => {
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(manifest, 'text/xml');
let el = xmlDoc.querySelector('ContentProtection');
let kid = el ? el.getAttribute('cenc:default_KID') : '';
return manifest;
};
host.updateLicenseRequestInfo = (requestInfo) => {
// customData is the message object that was sent to the receiver.
let body = JSON.stringify({
token: customData.token,
drm_info: Array.apply(null, requestInfo.content),
kid: kid
});
let buffer = [];
for (let i=0; i<body.length; i++) {
buffer.push(body.charCodeAt(i));
}
requestInfo.headers['Content-Type'] = 'application/json';
requestInfo.content = new Uint8Array(buffer);
}
protocol = cast.player.api.CreateDashStreamingProtocol(host);