【发布时间】: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。那就别管了。
标签: android-tv exoplayer2.x widevine