使用 Azure 媒体服务中的令牌播放 Widevine

Posted

技术标签:

【中文标题】使用 Azure 媒体服务中的令牌播放 Widevine【英文标题】:Playback Widevine with token from Azure Media Services 【发布时间】:2020-10-02 10:03:29 【问题描述】:

大家早上好, 我很难尝试添加一个简单的授权令牌来使用 react-native-video 从 azure 媒体服务播放受宽泛保护的内容。 这是我的代码:

   ref=(ref: Video) =>  this.video = ref 
    source=
      uri: "https://swannmediaservice-euwe.streaming.media.azure.net/95aae6ef-55a4-411d-9706-73890f5d2ba5/L'Homme qui courait après le Te.ism/manifest(format=mpd-time-cmaf,encryption=cenc)",type: 'mpd', 
      drm: 
        type: 'widevine', 
        headers: 
            'Authorization': 'Bearer=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3d3dy5zYXRvcmlwb3AuY29tLyIsImF1ZCI6InVybjpzYXRvcmlwb3AiLCJleHAiOjE3MTA4MDczODksIm5iZiI6MTYwMTMwMDA3OH0.O_41HbAcE8kFDivOM9Q4AL2z-4TMUTLchuUoyxCdDKY'
          
    
    

此 ofc 仅用于测试目的。

当我在 android 上测试它时,这总是在日志输出中给我这个错误: 引起:java.lang.IllegalStateException:媒体需要 DrmSessionManager 我假设是由于视频无法播放。

我在 azure 媒体播放器中对此进行了测试,一切正常。 这是一个链接:

https://aka.ms/azuremediaplayer?url=https%3A%2F%2Fswannmediaservice-euwe.streaming.media.azure.net%2F057936a3-2899-4d63-b287-3c50976c1bc4%2FFrench%20audiobook%20The%20Caliph%20A2x_.ism%2Fmanifest(format%3Dmpd-time-csf%2Cencryption%3Dcenc)&widevine=true&widevinetoken=Bearer%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3d3dy5zYXRvcmlwb3AuY29tLyIsImF1ZCI6InVybjpzYXRvcmlwb3AiLCJleHAiOjE3MTA4MDczODksIm5iZiI6MTYwMTMwMDA3OH0.O_41HbAcE8kFDivOM9Q4AL2z-4TMUTLchuUoyxCdDKY

而且效果很好。 这里有什么我遗漏的吗?

平台

ios Android ExoPlayer

视频示例

URI : https://swannmediaservice-euwe.streaming.media.azure.net/95aae6ef-55a4-411d-9706-73890f5d2ba5/L'Homme qui courait après le Te.ism/manifest(format=mpd-time-cmaf,encryption=cenc)

部首:承载= eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3d3dy5zYXRvcmlwb3AuY29tLyIsImF1ZCI6InVybjpzYXRvcmlwb3AiLCJleHAiOjE3MTA4MDczODksIm5iZiI6MTYwMTMwMDA3OH0.O_41HbAcE8kFDivOM9Q4AL2z-4TMUTLchuUoyxCdDKY P>

【问题讨论】:

那么您的问题是在问“如何添加授权令牌播放”吗?如果是这样,我认为您还需要添加 react-native 标签,因为这似乎是关于您正在使用的视频库的问题 @Tyler 好的,谢谢 【参考方案1】:

好吧,既然我发现了自己的问题,下面是解决方案:

由于 azure media services 会咨询他们自己的许可服务来播放媒体(而不是使用 3d 方许可服务),因此 exoplayer 没有意识到这一点,并尝试播放视频,即使响应中有 licenseServer(清单settings) 或没有,因为它希望在其 DRM 设置中粘贴一个 licenseService,以便它可以使用它来获取许可证并传递一个 Header。 所以基本上,当我没有使用 licensServer 并认为一切都自动运行时,我错了。 所以我的代码正在做的是:它从任何地方请求许可证,它不会工作。 因此,您必须解析来自链接的数据,手动提取许可证服务器并将其添加到请求中,如下所示:

 ref=(ref: Video) =>  this.video = ref 
    source=
      uri: "your mpd url",type: 'mpd', 
      drm: 
        type: 'widevine', 
        licenseServer: 'the Parsed license server form the mpd file',
        headers: 
            'Authorization': 'Bearer=yourtoken'
          
    
    

实现了,现在一切正常。

【讨论】:

这里你提到从清单文件中提取许可证 URL,你的意思是你会以编程方式解析它吗?如果是,请您详细说明一下吗? @Kavita_p 嘿 Kavita,这个答案有点过时了,因为如果清单中提供了 exoplayer 会自动解析许可证服务器,你所要做的就是像这样添加一个空的许可证服务器:drm: type: 'widevine', licenseServer: '', headers: 'Authorization': 'Bearer=yourtoken' exoplayer 将从清单中解析许可证服务器,当我不太了解它的功能时,我发了这篇文章,但是在阅读了 exoplayer 中一些 PR 的源代码后,我明白了。 谢谢,我去看看 Exo 播放器 PR【参考方案2】:

可能它来自可能有问题的清单名称。我建议不要使用重音字符或特殊字符(如 '),因为名称在流式 Url 中公开。尽可能删除空格。 为此,请重命名源文件,重新编码内容并再试一次。

【讨论】:

嘿 Xavier,感谢您的回复,但不幸的是,它不适用于另一个名称不同但不包含“我很困惑被困在这么小的事情中”的资产,我花了2天的时间寻找解决方案,请问您还有其他建议吗? 这是新制作的链接:aka.ms/…

以上是关于使用 Azure 媒体服务中的令牌播放 Widevine的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure 媒体服务进行实时音频编码

需要帮助获取 azure 媒体服务编码的视频以在 HTML5/DASH 中播放

Azure 媒体服务 - 视频播放因损坏而中止... (0x20400003)

C# 使用 REST API 连接到 Azure 媒体服务帐户

Azure 媒体播放器与 Youtube 和 Vimeo 的集成

如何保护离线播放加密视频作为保存的html格式,视频源是天蓝色媒体云服务器?