【问题标题】:How can I get protected playback of offline content with DOWNstream For Electron?如何使用 DOWNstream For Electron 获得离线内容的保护播放?
【发布时间】:2019-02-06 22:17:58
【问题描述】:

我正在尝试在 Electron 中保护离线内容的播放。

我正在尝试使用: https://github.com/castlabs/downstream_electron

以及与 Widevine 兼容的 Electron 版本:https://github.com/castlabs/electron-releases/releases/tag/v1.8.7-hdcp-vmp1010

根据下游电子的 README.md,应该“允许在 Electron 中受保护地播放离线内容”。

我使用dashjs 设置了一个概念验证,我可以在其中提取会话信息并下载受drm 保护的dash manifest 以及音频和视频片段。

我正在使用来自 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 保护的清单。如何获得“Electron 中离线内容的受保护播放”?

如果我将这个 offlineLink 值作为破折号视频播放器的来源,它仍然需要连接到互联网才能与许可证服务器通信,因此它不会真正脱机。

我的演示的一部分如下:

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)}
)

【问题讨论】:

    标签: javascript electron drm dash.js


    【解决方案1】:

    您需要提前申请许可证,特别是申请允许持久性(离线使用)的许可证。基本上,您需要在离线之前触发许可证请求。可能有一个函数调用在某处执行此操作,否则您可以开始播放以获取许可证,然后终止它。

    请注意,颁发的许可证必须允许离线使用,这不是默认设置。 EZDRM 演示内容可能允许您申请这样的许可证,但默认情况下不太可能给您这样的许可证。

    【讨论】:

    • 是的,这就是我最终要做的。我申请了永久许可证,然后在离线时将该 sessionID 提供给播放器。 CDM 处理其余部分。 Dashjs 公开了这些选项,但具体的播放器实现会有所不同
    • 感谢@houseman 的跟进。我自己也遇到了这个问题,这很有帮助。
    猜你喜欢
    • 2017-12-23
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2017-10-08
    • 1970-01-01
    • 2019-04-06
    • 2017-03-18
    相关资源
    最近更新 更多