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 对我不起作用,但我很想知道为什么。