Widevine 离线许可证使用 exoplayer 从 Azure 媒体服务获取令牌
Widevine Offline License Fetch with token from azure media services using exoplayer
我正在尝试使用 exoplayer 为我的 android 应用实现离线播放,我正在使用 azure 媒体服务来执行此操作。
我可以毫无问题地播放、下载、获取离线 widevine 许可证和离线播放。
当我需要授权令牌时,我的问题就出现了,当我添加令牌时我的内容按预期播放,但是当我想下载它时它无法获取离线 DRM 许可证。
我在 exoplayer 中使用这个功能
OfflineLicenseHelper offlineLicenseHelper = OfflineLicenseHelper.newWidevineInstance(
null,
false,
httpDataSourceFactory,
requestHeaders,
new DrmSessionEventListener.EventDispatcher());
请记住,我根据文档设置了 null 和 false,因为 azure 媒体服务在清单中提供了它自己的许可证服务器。
这是离线许可证助手中的函数文档
/**
* Instantiates a new instance which uses Widevine CDM. Call {@link #release()} when the instance
* is no longer required.
*
* @param defaultLicenseUrl The default license URL. Used for key requests that do not specify
* their own license URL.
* @param forceDefaultLicenseUrl Whether to use {@code defaultLicenseUrl} for key requests that
* include their own license URL.
* @param optionalKeyRequestParameters An optional map of parameters to pass as the last argument
* to {@link MediaDrm#getKeyRequest}. May be null.
* @param eventDispatcher A {@link DrmSessionEventListener.EventDispatcher} used to distribute
* DRM-related events.
* @return A new instance which uses Widevine CDM.
* @see DefaultDrmSessionManager.Builder
*/
public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl,
boolean forceDefaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory,
@Nullable Map<String, String> optionalKeyRequestParameters,
DrmSessionEventListener.EventDispatcher eventDispatcher)
我确定我的 header 一切顺利,因为我正在记录所有内容。
这是我请求的结果:
2020-10-13 09:44:19.143 29964-29964/com.videoplayer E/DownloadTracker: Failed to fetch offline DRM license
com.google.android.exoplayer2.drm.DrmSession$DrmSessionException: com.google.android.exoplayer2.drm.MediaDrmCallbackException: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 401
at com.google.android.exoplayer2.drm.DefaultDrmSession.onError(DefaultDrmSession.java:518)
at com.google.android.exoplayer2.drm.DefaultDrmSession.onKeysError(DefaultDrmSession.java:513)
at com.google.android.exoplayer2.drm.DefaultDrmSession.onKeyResponse(DefaultDrmSession.java:476)
at com.google.android.exoplayer2.drm.DefaultDrmSession.access0(DefaultDrmSession.java:57)
at com.google.android.exoplayer2.drm.DefaultDrmSession$ResponseHandler.handleMessage(DefaultDrmSession.java:557)
这是一个授权问题,但我不确定是因为我传递了错误的数据还是因为 azure media services?
如果它来自 azure,那么我如何能够使用完全相同的令牌播放流(如果我更改令牌则不起作用)并且没有收到具有完全相同令牌的离线许可证?
任何回复都会有帮助,谢谢。
好吧,对于遇到同样问题的任何人,我通过将 headers 直接设置到 httpDataSourceFactory 来解决它,所以这里是修复它的代码:
httpDataSourceFactory.getDefaultRequestProperties().set("Authorization","Bearer=yourtokenhere");
OfflineLicenseHelper offlineLicenseHelper = OfflineLicenseHelper.newWidevineInstance(
null,
false,
httpDataSourceFactory,
requestHeaders,
new DrmSessionEventListener.EventDispatcher());
android.util.Log.d(TAG, "doInBackground rh : "+requestHeaders);
不知道为什么请求 headers 对我不起作用,但我很想知道为什么。
我正在尝试使用 exoplayer 为我的 android 应用实现离线播放,我正在使用 azure 媒体服务来执行此操作。
我可以毫无问题地播放、下载、获取离线 widevine 许可证和离线播放。
当我需要授权令牌时,我的问题就出现了,当我添加令牌时我的内容按预期播放,但是当我想下载它时它无法获取离线 DRM 许可证。
我在 exoplayer 中使用这个功能
OfflineLicenseHelper offlineLicenseHelper = OfflineLicenseHelper.newWidevineInstance(
null,
false,
httpDataSourceFactory,
requestHeaders,
new DrmSessionEventListener.EventDispatcher());
请记住,我根据文档设置了 null 和 false,因为 azure 媒体服务在清单中提供了它自己的许可证服务器。
这是离线许可证助手中的函数文档
/**
* Instantiates a new instance which uses Widevine CDM. Call {@link #release()} when the instance
* is no longer required.
*
* @param defaultLicenseUrl The default license URL. Used for key requests that do not specify
* their own license URL.
* @param forceDefaultLicenseUrl Whether to use {@code defaultLicenseUrl} for key requests that
* include their own license URL.
* @param optionalKeyRequestParameters An optional map of parameters to pass as the last argument
* to {@link MediaDrm#getKeyRequest}. May be null.
* @param eventDispatcher A {@link DrmSessionEventListener.EventDispatcher} used to distribute
* DRM-related events.
* @return A new instance which uses Widevine CDM.
* @see DefaultDrmSessionManager.Builder
*/
public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl,
boolean forceDefaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory,
@Nullable Map<String, String> optionalKeyRequestParameters,
DrmSessionEventListener.EventDispatcher eventDispatcher)
我确定我的 header 一切顺利,因为我正在记录所有内容。
这是我请求的结果:
2020-10-13 09:44:19.143 29964-29964/com.videoplayer E/DownloadTracker: Failed to fetch offline DRM license
com.google.android.exoplayer2.drm.DrmSession$DrmSessionException: com.google.android.exoplayer2.drm.MediaDrmCallbackException: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 401
at com.google.android.exoplayer2.drm.DefaultDrmSession.onError(DefaultDrmSession.java:518)
at com.google.android.exoplayer2.drm.DefaultDrmSession.onKeysError(DefaultDrmSession.java:513)
at com.google.android.exoplayer2.drm.DefaultDrmSession.onKeyResponse(DefaultDrmSession.java:476)
at com.google.android.exoplayer2.drm.DefaultDrmSession.access0(DefaultDrmSession.java:57)
at com.google.android.exoplayer2.drm.DefaultDrmSession$ResponseHandler.handleMessage(DefaultDrmSession.java:557)
这是一个授权问题,但我不确定是因为我传递了错误的数据还是因为 azure media services?
如果它来自 azure,那么我如何能够使用完全相同的令牌播放流(如果我更改令牌则不起作用)并且没有收到具有完全相同令牌的离线许可证?
任何回复都会有帮助,谢谢。
好吧,对于遇到同样问题的任何人,我通过将 headers 直接设置到 httpDataSourceFactory 来解决它,所以这里是修复它的代码:
httpDataSourceFactory.getDefaultRequestProperties().set("Authorization","Bearer=yourtokenhere");
OfflineLicenseHelper offlineLicenseHelper = OfflineLicenseHelper.newWidevineInstance(
null,
false,
httpDataSourceFactory,
requestHeaders,
new DrmSessionEventListener.EventDispatcher());
android.util.Log.d(TAG, "doInBackground rh : "+requestHeaders);
不知道为什么请求 headers 对我不起作用,但我很想知道为什么。