使用exoplayer从Azure媒体服务中使用令牌获取Widevine脱机许可证

问题描述

我正在尝试使用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) 

我确定我的标头传递得很好,因为我正在记录所有内容。

这是我的请求的结果:

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.access$100(DefaultDrmSession.java:57)
        at com.google.android.exoplayer2.drm.DefaultDrmSession$ResponseHandler.handleMessage(DefaultDrmSession.java:557)

这是一个授权问题,但是我不确定是因为我传递了错误的数据还是由于天蓝色的媒体服务?

如果它来自天蓝色,那我怎么能使用完全相同的令牌播放流(如果我更改了令牌就无法工作)并且不接收具有完全相同的令牌的脱机许可证? >

任何回复都可以提供帮助,谢谢。

解决方法

好吧,对于任何遇到相同问题的人,我都通过将标头直接设置到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);

不确定为什么请求标头对我不起作用,但是我很想知道为什么。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...