【问题标题】:Widewine Drm in Exoplayer ErrorExoplayer 错误中的 Widevine Drm
【发布时间】:2017-11-15 05:40:30
【问题描述】:

我正在 Exoplayer Android 上实现一个 OTT 应用程序。我们正在使用 Widewine DRM 保护我们的内容。但我们收到了如下所示的错误。

 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err: com.google.android.exoplayer2.drm.UnsupportedDrmException: android.media.UnsupportedSchemeException: Failed to instantiate drm object.
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.google.android.exoplayer2.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:50)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.cinesoft.cinehome.player.PlayerActivity.buildDrmSessionManager(PlayerActivity.java:483)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.cinesoft.cinehome.player.PlayerActivity.initPlayer(PlayerActivity.java:398)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.cinesoft.cinehome.player.PlayerActivity.onPlayRequestResult(PlayerActivity.java:1308)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.cinesoft.cinehome.api.services.ConnectToServer$3.onResponse(ConnectToServer.java:503)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.cinesoft.cinehome.api.services.ConnectToServer$3.onResponse(ConnectToServer.java:483)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at android.os.Looper.loop(Looper.java:148)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7325)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err: Caused by: android.media.UnsupportedSchemeException: Failed to instantiate drm object.
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at android.media.MediaDrm.native_setup(Native Method)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at android.media.MediaDrm.<init>(MediaDrm.java:215)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.google.android.exoplayer2.drm.FrameworkMediaDrm.<init>(FrameworkMediaDrm.java:57)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     at com.google.android.exoplayer2.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:48)
 06-13 17:31:53.641 18652-18652/com.cinesoft.cinehome.android W/System.err:     ... 14 more

代码如下所示

mediaDataSourceFactory = buildDataSourceFactory(true);
        mainHandler = new Handler();
        bandwidthMeter = new DefaultBandwidthMeter();

        videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);

        trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
        eventLogger = new EventLogger(trackSelector);
        if (JsonParser.sStr_drmStatus.equalsIgnoreCase("1")) {
            AndroidDeviceIdentifier androidDeviceIdentifier = new AndroidDeviceIdentifier();
            UUID drmSchemeUuid = null;
            drmSchemeUuid = UUID.fromString(androidDeviceIdentifier.getUniqueDeviceIdentifier(PlayerActivity.this));
            drmSessionManager = null;
            if (drmSchemeUuid != null) {
                String drmLicenseUrl = ConnectPortalSettings.WIDEVINE_LICENSE_SERVER_URL;
                String[] keyRequestPropertiesArray = new String[]{};
                //                drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL);
                //                keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES);
                try {
                    drmSessionManager = buildDrmSessionManager(drmSchemeUuid, drmLicenseUrl,
                            keyRequestPropertiesArray);
                } catch (UnsupportedDrmException e) {
                    int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported
                            : (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME
                            ? R.string.error_drm_unsupported_scheme : R.string.error_drm_unknown);
                    e.printStackTrace();
                    Log.e("Drm Error Code", String.valueOf(errorStringId));
                    return;
                }
            }
            @SimpleExoPlayer.ExtensionRendererMode int extensionRendererMode =
                    ((BaseApplication) getApplication()).useExtensionRenderers()
                            ? (false ? SimpleExoPlayer.EXTENSION_RENDERER_MODE_PREFER
                            : SimpleExoPlayer.EXTENSION_RENDERER_MODE_ON)
                            : SimpleExoPlayer.EXTENSION_RENDERER_MODE_OFF;
            LoadControl loadControl = new DefaultLoadControl();
 // 3. Create the player

                 player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl,
                    drmSessionManager, extensionRendererMode);
        } else {
            LoadControl loadControl = new DefaultLoadControl();
            player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
        }

请帮我解决这个问题。提前致谢。

【问题讨论】:

  • 这是我的陷阱之一。 “edef8ba9-79d6-4ace-a3c8-27dcd51d21ed”的 uuid 不需要某些设备属性。同样作为健全性检查,返回示例应用程序并将其指向谷歌的服务器之一以验证设备等可能是值得的。

标签: android drm widevine exoplayer2.x


【解决方案1】:

转储中有很多数据可能会令人困惑和分散注意力,但您需要关注的错误是:

android.media.UnsupportedSchemeException: 无法实例化 drm 对象

您是在模拟器上运行它吗? 您可能需要在真实设备上运行它才能进行测试。 在以下位置查看更多信息: https://github.com/google/ExoPlayer/issues/1616

如果您不是在模拟器上运行,而是在设备上运行,则可能是您运行它的设备有问题,如下所示: https://github.com/google/ExoPlayer/issues/2260

另外,请注意,当我们关注该错误时,我们也认识到它是: UnsupportedSchemeException

尝试构造 MediaDrm 时抛出异常 使用设备不支持的加密方案 UUID 的对象

来自: https://developer.android.com/reference/android/media/UnsupportedSchemeException.html

【讨论】:

  • :我在真实设备中运行代码,而您提供的第二个链接是死胡同。我正在使用以下代码检索 UUID
  • public static String getDeviceUUID(Context ctx) throws UnsupportedEncodingException, NoSuchAlgorithmException { byte[] hash = makeHash(getMac(ctx), getSerialNumber(ctx));返回 createUUIDFromHash(hash); }
  • 没有死胡同。只是有些地方有时你必须跳过栅栏。 :) 关键是该链接还提到“它与您的设备有关”。我会在我的几个设备上尝试这个方法,然后告诉你。
  • 感谢您的关心
  • 我们必须仔细查看 UnsupportedEncodingException -- developer.android.com/reference/java/io/… 当该异常发生时,它应该用它发生的原因填充字符串。它可能与您传入的散列变量上使用的编码不同。
【解决方案2】:

正如 raddevus 所说,该错误表示播放器无法识别 DRM 方案标识符。

不同的 DRM 具有不同的方案 ID - Widevines 是“urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED”。

可能是包含了错误的方案 id 或者没有正确读取编码。

检查 MPD 是否包含保护信息也是值得的 - 规范说它应该在 MPD 和 MP4 PSSH 标头中,但一些打包程序仅将它包含在 MP4 PSSH 标头中,在这种情况下 Exoplayer 不会在 MPD 中找到它。

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 2021-04-20
    • 2021-07-05
    • 2015-07-19
    • 2015-12-28
    • 2019-06-22
    • 1970-01-01
    • 2023-03-06
    • 2014-10-21
    相关资源
    最近更新 更多