如何使用 DOWNstream For Electron 保护离线内容的播放?
How can I get protected playback of offline content with DOWNstream For Electron?
我正在尝试在 Electron 中保护离线内容的播放。
我正在尝试使用:
https://github.com/castlabs/downstream_electron
以及与 Widevine 兼容的 Electron 版本:https://github.com/castlabs/electron-releases/releases/tag/v1.8.7-hdcp-vmp1010
根据 downstream_electron 的 README.md,“允许在 Electron 中保护离线内容播放”。
我使用 dashjs 设置了概念验证,我可以在其中提取会话信息并下载受 drm 保护的 dash 清单以及音频和视频片段。
我正在使用 ezdrm 的公开资源:
清单:http://wvm.ezdrm.com/demo/stream.mpd
许可证服务器:http://widevine-dash.ezdrm.com/proxy?pX=BF9CEB
当我在下载资产后调用 DownstreamElectronFE.downloads.getOfflineLink() 时,它返回给我:
{
offlineLink:"http://127.0.0.1:3010/movies/6441406178546155520/stream.mpd"
persistent:"F75D9FC450010B582A7951ED228DAF85"
}
所以我从本地服务器获得了受 drm 保护的本地清单。我如何获得 "protected playback of offline content within Electron"?
如果我将这个 offlineLink
值作为源提供给 dash 视频播放器,它仍然需要连接到 Internet 才能与许可服务器通信,所以它不会是真正的离线。
我的部分演示如下:
const dashjs = require('dashjs');
let session
function FakePersistentPlugin() {
this.createPersistentSession = (persistentConfig) => {
console.log('create - call of fake persistent plugin, persistentConfig', persistentConfig);
return new Promise((resolve) => {
setTimeout(function () {
console.log('resolving session',session.sessionId)
resolve(session.sessionId);
}, 5000);
});
};
this.removePersistentSession = (sessionId) => {
console.log('remove - call of fake persistent plugin, sessionId', sessionId);
return new Promise((resolve) => {
setTimeout(() => {
console.log('remove - call of fake persistent plugin resolved', sessionId);
resolve();
}, 5000);
});
};
}
const downstreamElectron = require("downstream-electron/dist").init(window,new FakePersistentPlugin());
console.log('downstreamElectron is ',downstreamElectron);
var player = dashjs.MediaPlayer().create();
player.setProtectionData({'com.widevine.alpha':{serverURL:'http://widevine-dash.ezdrm.com/proxy?pX=BF9CEB'}});
player.initialize(document.querySelector("#videoPlayer"))
player.attachSource('http://wvm.ezdrm.com/demo/stream.mpd')
player.play()
player.on( dashjs.MediaPlayer.events.KEY_SESSION_CREATED, (e) => {
session = e.data.session;
console.log('session is ',session)
});
const config = {
licenseUrl:'http://widevine-dash.ezdrm.com/proxy?pX=BF9CEB',
serverCertificate: new Uint8Array([0])
}
let manifestId
let persistId
function onProgress (err, stats) {
if (err) {
console.logs('on progress err', err, stats);
}
console.log('on progress ',stats);
};
function onFinish (err, info) {
if (err) {
console.log("onFinish error", err);
} else {
console.log("onFinish success", info);
downstreamElectron.downloads.getOfflineLink(info.manifestInfo.id)
.then(
function onSuccess(result) {console.log("offlineLink success", result)},
function onError(err) {console.log("error", err)
})
}
};
downstreamElectron.downloads.create('http://wvm.ezdrm.com/demo/stream.mpd')
.then(
function onSuccess(result) {
console.log("create success", result)
manifestId = result.id
downstreamElectron.downloads.createPersistent(manifestId,config)
.then(
(result)=>{
console.log("createPersistent success",result)
persistId = result
downstreamElectron.downloads.savePersistent(manifestId,persistId)
.then(
() => {
console.log('savePersistent success')
downstreamElectron.downloads.start(manifestId,{video:['video/avc1'],audio:['audio/und/mp4a']})
.then(
function onSuccess() {console.log("start success")},
function onError(err) {console.log("start error", err)
})
downstreamElectron.downloads.subscribe(manifestId, 1000, onProgress, onFinish)
.then(
function onSuccess() {console.log("subscribed successfully")},
function onError(err) {console.log("subscribe error", err)
})
},
(err) => {
console.log('savePersistent error',err)
}
)
},
(err)=>{
console.log("createPersistent error",err)
}
)
},
function onError(err) {console.log("create error", err)}
)
您需要提前申请license,具体申请允许持久化(离线使用)的license。基本上,您需要在离线之前触发许可请求。某处可能有一个函数调用来执行此操作,否则您可以开始播放以获取许可证,然后再终止它。
请注意,颁发的许可证必须允许离线使用,这不是默认设置。 EZDRM 演示内容可能允许您申请这样的许可证,但它不太可能默认为您提供这样的许可证。
我正在尝试在 Electron 中保护离线内容的播放。
我正在尝试使用: https://github.com/castlabs/downstream_electron
以及与 Widevine 兼容的 Electron 版本:https://github.com/castlabs/electron-releases/releases/tag/v1.8.7-hdcp-vmp1010
根据 downstream_electron 的 README.md,“允许在 Electron 中保护离线内容播放”。
我使用 dashjs 设置了概念验证,我可以在其中提取会话信息并下载受 drm 保护的 dash 清单以及音频和视频片段。
我正在使用 ezdrm 的公开资源:
清单:http://wvm.ezdrm.com/demo/stream.mpd
许可证服务器:http://widevine-dash.ezdrm.com/proxy?pX=BF9CEB
当我在下载资产后调用 DownstreamElectronFE.downloads.getOfflineLink() 时,它返回给我:
{
offlineLink:"http://127.0.0.1:3010/movies/6441406178546155520/stream.mpd"
persistent:"F75D9FC450010B582A7951ED228DAF85"
}
所以我从本地服务器获得了受 drm 保护的本地清单。我如何获得 "protected playback of offline content within Electron"?
如果我将这个 offlineLink
值作为源提供给 dash 视频播放器,它仍然需要连接到 Internet 才能与许可服务器通信,所以它不会是真正的离线。
我的部分演示如下:
const dashjs = require('dashjs');
let session
function FakePersistentPlugin() {
this.createPersistentSession = (persistentConfig) => {
console.log('create - call of fake persistent plugin, persistentConfig', persistentConfig);
return new Promise((resolve) => {
setTimeout(function () {
console.log('resolving session',session.sessionId)
resolve(session.sessionId);
}, 5000);
});
};
this.removePersistentSession = (sessionId) => {
console.log('remove - call of fake persistent plugin, sessionId', sessionId);
return new Promise((resolve) => {
setTimeout(() => {
console.log('remove - call of fake persistent plugin resolved', sessionId);
resolve();
}, 5000);
});
};
}
const downstreamElectron = require("downstream-electron/dist").init(window,new FakePersistentPlugin());
console.log('downstreamElectron is ',downstreamElectron);
var player = dashjs.MediaPlayer().create();
player.setProtectionData({'com.widevine.alpha':{serverURL:'http://widevine-dash.ezdrm.com/proxy?pX=BF9CEB'}});
player.initialize(document.querySelector("#videoPlayer"))
player.attachSource('http://wvm.ezdrm.com/demo/stream.mpd')
player.play()
player.on( dashjs.MediaPlayer.events.KEY_SESSION_CREATED, (e) => {
session = e.data.session;
console.log('session is ',session)
});
const config = {
licenseUrl:'http://widevine-dash.ezdrm.com/proxy?pX=BF9CEB',
serverCertificate: new Uint8Array([0])
}
let manifestId
let persistId
function onProgress (err, stats) {
if (err) {
console.logs('on progress err', err, stats);
}
console.log('on progress ',stats);
};
function onFinish (err, info) {
if (err) {
console.log("onFinish error", err);
} else {
console.log("onFinish success", info);
downstreamElectron.downloads.getOfflineLink(info.manifestInfo.id)
.then(
function onSuccess(result) {console.log("offlineLink success", result)},
function onError(err) {console.log("error", err)
})
}
};
downstreamElectron.downloads.create('http://wvm.ezdrm.com/demo/stream.mpd')
.then(
function onSuccess(result) {
console.log("create success", result)
manifestId = result.id
downstreamElectron.downloads.createPersistent(manifestId,config)
.then(
(result)=>{
console.log("createPersistent success",result)
persistId = result
downstreamElectron.downloads.savePersistent(manifestId,persistId)
.then(
() => {
console.log('savePersistent success')
downstreamElectron.downloads.start(manifestId,{video:['video/avc1'],audio:['audio/und/mp4a']})
.then(
function onSuccess() {console.log("start success")},
function onError(err) {console.log("start error", err)
})
downstreamElectron.downloads.subscribe(manifestId, 1000, onProgress, onFinish)
.then(
function onSuccess() {console.log("subscribed successfully")},
function onError(err) {console.log("subscribe error", err)
})
},
(err) => {
console.log('savePersistent error',err)
}
)
},
(err)=>{
console.log("createPersistent error",err)
}
)
},
function onError(err) {console.log("create error", err)}
)
您需要提前申请license,具体申请允许持久化(离线使用)的license。基本上,您需要在离线之前触发许可请求。某处可能有一个函数调用来执行此操作,否则您可以开始播放以获取许可证,然后再终止它。
请注意,颁发的许可证必须允许离线使用,这不是默认设置。 EZDRM 演示内容可能允许您申请这样的许可证,但它不太可能默认为您提供这样的许可证。