检测 Widevine DRM HDCP 保护级别

Posted

技术标签:

【中文标题】检测 Widevine DRM HDCP 保护级别【英文标题】:Detect Widevine DRM HDCP protection level 【发布时间】:2020-01-13 17:48:00 【问题描述】:

我目前正在使用 Dash/Widevine DRM 切换到 ExoPlayer。通过测试,我遇到了很大比例的设备没有启用 HDCP 保护。由于合同协议,这是一个问题。我必须在允许播放之前检测到并记录它。

我从应用程序DRM Info 中得到灵感,这甚至是一种可能性

我的第一个想法是使用DrmManagerClient

我放弃了它,因为我没有得到结果并尝试使用MediaDrm

val mediaDrm = MediaDrm(WIDEVINE_UUID)

val vendor = mediaDrm.getPropertyString(MediaDrm.PROPERTY_VENDOR)
val version = mediaDrm.getPropertyString(MediaDrm.PROPERTY_VERSION)
val description = mediaDrm.getPropertyString(MediaDrm.PROPERTY_DESCRIPTION)
val algorithms = mediaDrm.getPropertyString(MediaDrm.PROPERTY_ALGORITHMS)

var hdcp: String? = null

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) 
   hdcp = mediaDrm.connectedHdcpLevel.toString()


Log.i("WideVine", "$vendor $version $description $algorithms $hdcp")

哪个有效!惊人的问题解决了!

...除了您可以看到它只适用于 Pie 及以上...这是不行的。 DrmInfo 将适用于我尝试过的每个 android 版本。我只是不知道如何使用DrmManagerClient,而且文档几乎不存在。

任何信息都会被重视,谢谢。

【问题讨论】:

【参考方案1】:

好的,所以在经历了一整天的努力之后,我开始认为这是不可能的。我的最佳尝试都失败了,*** 的帖子甚至与该主题远程相关都有提示,但没有成功。

val algorithms = mediaDrm.getPropertyString("maxHdcpLevel")

但正如您在此处看到的,这不会通过编译器,需要MediaDrm.Property*

val stringProperties = arrayOf(
                MediaDrm.PROPERTY_VENDOR,
                MediaDrm.PROPERTY_VERSION,
                MediaDrm.PROPERTY_DESCRIPTION,
                MediaDrm.PROPERTY_ALGORITHMS,
                "maxHdcpLevel")

val widevinePropertiesMap = mutableMapOf<String, String>()

for (prop in stringProperties) 
     widevinePropertiesMap[prop] = mediaDrm.getPropertyString(prop)
     Log.i(prop, mediaDrm.getPropertyString(prop))
     

Log.i("maxHdcpLevel:", "$widevinePropertiesMap["maxHdcpLevel"]")

或者,如果你只想得到一件事,你可以……

@SupressLint("WrongConstant")

这行得通!

我不太确定你为什么可以通过这种方式利用该方法,但是,它可以完成工作!

以下是我们可以获得的一些附加属性:

  val securityLevel = mediaDrm.getPropertyString("securityLevel")
  val systemId = mediaDrm.getPropertyString("systemId")
  val hdcpLevel = mediaDrm.getPropertyString("hdcpLevel")
  val maxHdcpLevel = mediaDrm.getPropertyString("maxHdcpLevel")
  val usageReportingSupport = mediaDrm.getPropertyString("usageReportingSupport")
  val maxNumberOfSessions = mediaDrm.getPropertyString("maxNumberOfSessions")
  val numberOfOpenSessions = mediaDrm.getPropertyString("numberOfOpenSessions")

【讨论】:

其中一些键可能会抛出异常,因为我遇到的可能还想包装在 try catch 块中。

以上是关于检测 Widevine DRM HDCP 保护级别的主要内容,如果未能解决你的问题,请参考以下文章

使用 MediaDrm 在 android 中解密受 Widevine DRM 保护的视频

html 播放器的 Widevine DRM 保护内容中的用户授权。

深入理解DRM——了解Widevine与OEMCrypto

Google Widevine DRM 密钥轮换

在 iOS 上玩 Widevine DRM?

如何在android webview中播放widevine drm内容