如何使用DOWNstream For Electron获取离线内容的受保护播放?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用DOWNstream For Electron获取离线内容的受保护播放?相关的知识,希望对你有一定的参考价值。

我正试图在Electron中获得离线内容的受保护播放。

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

以及与他们的Widevine兼容的电子构建:https://github.com/castlabs/electron-releases/releases/tag/v1.8.7-hdcp-vmp1010

根据downstream_electron的README.md,“应该允许在Electron中保护播放离线内容”。

我有一个dashjs概念验证设置,我可以提取会话信息并下载受drm保护的破折号清单,以及音频和视频片段。

我正在使用来自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)
)
答案

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

请注意,颁发的许可证必须允许脱机使用,这不是默认值。 EZDRM演示内容可能允许您请求此类许可证,但默认情况下不太可能给您这样的许可证。

以上是关于如何使用DOWNstream For Electron获取离线内容的受保护播放?的主要内容,如果未能解决你的问题,请参考以下文章

goldengate downstream 配置

7RNAseq Downstream Analysis

如何限制 Airflow 一次只运行一个 DAG 实例?

如何导入ipcRenderer做出反应?

如何在 React Native 中使用 switch 进行条件渲染?

JDK12 Collectors.teeing 功能真香