Exoplayer 2.0 上的 Widevine DRM 内容
Posted
技术标签:
【中文标题】Exoplayer 2.0 上的 Widevine DRM 内容【英文标题】:Widevine DRM Content on Exoplayer 2.0 【发布时间】:2019-09-24 07:05:12 【问题描述】:我正在尝试使用 Exoplayer 在 android TV 应用程序上播放 Widevine 加密内容。我有我的视频 URL,它是从 CDN 提供的,并通过票证获得。我有我的 Widevine 许可证 URL、一张票证和许可证服务器的身份验证令牌。
我正在创建一个 drmSessionManager,将许可证服务器所需的必要标头放置如下:
UUID drmSchemeUuid = C.WIDEVINE_UUID;
mediaDrm = FrameworkMediaDrm.newInstance(drmSchemeUuid);
static final String USER_AGENT = "user-agent";
HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback("my-license-server", new DefaultHttpDataSourceFactory(USER_AGENT));
keyRequestProperties.put("ticket-header", ticket);
keyRequestProperties.put("token-header", token);
drmCallback.setKeyRequestProperty("ticket-header", ticket);
drmCallback.setKeyRequestProperty("token-header", token);
new DefaultDrmSessionManager(drmSchemeUuid, mediaDrm, drmCallback, keyRequestProperties)
在这个 Exoplayer 处理了大部分内容之后,会遇到以下断点。
response = callback.executeKeyRequest(uuid, (KeyRequest) request);
in class DefaultDrmSession
return executePost(dataSourceFactory, url, request.getData(), requestProperties) in HttpMediaDrmCallback
到目前为止,我可以观察到一切都很好,URL 是正确的,标题设置得很好。
在下面的代码中,我可以观察到 dataSpec 很好,尝试使用正确的数据POST 向许可证服务器发出请求,但是在发出响应码返回405的连接。
在课堂上:DefaultHttpDataSource
在方法中:public long open(DataSpec dataSpec)
this.dataSpec = dataSpec;
this.bytesRead = 0;
this.bytesSkipped = 0;
transferInitializing(dataSpec);
try
connection = makeConnection(dataSpec);
catch (IOException e)
throw new HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e,
dataSpec, HttpDataSourceException.TYPE_OPEN);
try
responseCode = connection.getResponseCode();
responseMessage = connection.getResponseMessage();
catch (IOException e)
closeConnectionQuietly();
throw new HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e,
dataSpec, HttpDataSourceException.TYPE_OPEN);
当使用 postman 向 URL 发出请求时,GET 请求返回以下正文,响应代码为 405。
"Message": "请求的资源不支持 http 方法 'GET'。"
POST 请求也返回响应代码 405,但返回一个空正文。
在这两种情况下,还会返回以下标头,我认为请求必须接受 GET 和 POST 请求。
Access-Control-Allow-Methods →GET, POST
我无权访问 DRM 服务器 的配置,我负责 DRM 服务器的联系人告诉我 POST 请求必须正常工作,因为有些客户端已成功获取从同一 DRM 服务器播放的内容。
我现在很困惑,我想也许我在 exoplayer 中缺少某种配置,因为我对 DRM 的概念还很陌生。
任何帮助将不胜感激。
【问题讨论】:
您尝试获取的内容是什么视频类型? 您好本杰明,我正在尝试获取 DASH 视频。虽然我是从 CDN 获取的,但如果这有什么不同,则 URL 不会以 mpd 结尾。 您可能想考虑使用DashMediaSource
而不是DefaultHttpDataSource
。您的其余代码看起来是正确的。
HttpMediaDrmCallback 构造函数不支持那些 MediaSources(我的意思是 SS、HLS 和 DASH 的媒体源),我在其他地方准备了 MediaSource 并将其传递给播放器。并且是按照视频格式准备的。
我误会了,以为您正在向播放器发送 DefaultHttpDataSource。那就别管了。
【参考方案1】:
我们找到了解决方案。为 DRM 许可证服务器提供的票证错误。这可以正常工作,并且正在播放内容。以防万一有人遇到同样的问题或需要基本的 Widevine 内容播放代码,目前可以正常工作。
最好的问候。
【讨论】:
以上是关于Exoplayer 2.0 上的 Widevine DRM 内容的主要内容,如果未能解决你的问题,请参考以下文章