当前位置: 首页 > 知识库问答 >
问题:

如何让ExoPlayer播放DRM PlayReady内容?

吴高远
2023-03-14

我无法通过ExoPlayer框架运行DRM PlayReady内容。我想这与我的drmSessionManager有关

清单Url和LicenseUrl都已经过测试,但很难实现我的更改,因为没有真正的具体示例实现任何DRM内容(WideVine或PlayReady)

正常的Dash内容与ExoPlayer配合使用,但当我尝试播放任何受DRM保护的内容时,它失败了。

        DataSource.Factory dataSourceFactory =
                new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "ExoPlayerDASHPR"));
        try {
            drmSessionManager = buildDrmSessionManager(C.PLAYREADY_UUID, drmLicenseUrl, true);
        } catch (Exception e) {
            System.out.println(e);
        }

        player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(this), new DefaultTrackSelector(), drmSessionManager);
        playerView.setPlayer(player);




        DashMediaSource mediaSource = new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(dataSourceFactory), dataSourceFactory).createMediaSource(manifestUri);
        player.prepare(mediaSource);
        player.setPlayWhenReady(true);
    }

构建实际drmSessionManager的方法(我认为问题所在)

private DefaultDrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(
            UUID uuid, String licenseUrl, boolean multiSession)
            throws UnsupportedDrmException {
        HttpMediaDrmCallback httpMediaDrmCallback =  new HttpMediaDrmCallback(licenseUrl,
                new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "ExoPlayerDASHPR")));
        releaseMediaDrm();
        mediaDrm = FrameworkMediaDrm.newInstance(uuid);
        return new DefaultDrmSessionManager<>(uuid, mediaDrm, httpMediaDrmCallback, null, multiSession);
    }

希望它在Android设备上通过我的WebView播放PlayReady内容。我百分之百确定该设备支持PlayReady,因为它是NVidia屏蔽。

下面的错误消息

2019-10-18 09:56:18.272 31508-31555/com.example.exoplayer_dashpr E/ExoPlayerImplInternal: Playback error.
    com.google.android.exoplayer2.ExoPlaybackException
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.shouldWaitForKeys(MediaCodecRenderer.java:842)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:739)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:574)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:518)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:193)
        at android.os.HandlerThread.run(HandlerThread.java:65)
     Caused by: com.google.android.exoplayer2.drm.DrmSession$DrmSessionException: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 500
        at com.google.android.exoplayer2.drm.DefaultDrmSession.onError(DefaultDrmSession.java:422)
        at com.google.android.exoplayer2.drm.DefaultDrmSession.onKeysError(DefaultDrmSession.java:417)
        at com.google.android.exoplayer2.drm.DefaultDrmSession.onKeyResponse(DefaultDrmSession.java:379)
        at com.google.android.exoplayer2.drm.DefaultDrmSession.access$100(DefaultDrmSession.java:41)
        at com.google.android.exoplayer2.drm.DefaultDrmSession$PostResponseHandler.handleMessage(DefaultDrmSession.java:472)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193) 
        at android.os.HandlerThread.run(HandlerThread.java:65) 
     Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 500
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:211)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:102)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.read(DataSourceInputStream.java:82)
        at com.google.android.exoplayer2.upstream.DataSourceInputStream.read(DataSourceInputStream.java:76)
        at com.google.android.exoplayer2.util.Util.toByteArray(Util.java:128)
        at com.google.android.exoplayer2.drm.HttpMediaDrmCallback.executePost(HttpMediaDrmCallback.java:159)
        at com.google.android.exoplayer2.drm.HttpMediaDrmCallback.executeKeyRequest(HttpMediaDrmCallback.java:134)
        at com.google.android.exoplayer2.drm.DefaultDrmSession$PostRequestHandler.handleMessage(DefaultDrmSession.java:503)
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.os.HandlerThread.run(HandlerThread.java:65) 

共有1个答案

翟单弓
2023-03-14

在这种情况下,ExoPlayer似乎工作正常-正在发送对许可证服务器的请求并接收响应。

问题是服务器正在发送一个响应,指示其端部有错误。

这可能是由于一些内部错误,但更有可能是因为传递给服务器的某些凭据(例如提供授权信息的令牌)无效或丢失,或者清单或媒体流中的keyid不正确。

DRM服务器往往不会给出特别冗长或详细的错误消息作为响应,以防止发送重复不正确请求以尝试了解服务器安全机制的攻击。

 类似资料:
  • 我已使用Azure媒体服务存储加密视频 有人能帮我解决以下问题吗: 我从哪里获得Widevine许可证URL,以便在Exo Player中播放视频 提前感谢。

  • 我正在开发一个应用程序,我使用了谷歌的ExoPlayer,它工作起来很有魅力,现在我想在我的应用程序中添加RTSP支持,但使用ExoPlayer我无法播放,请任何人都可以帮我,如果有人有其他选择,请与我分享。 日志 E/ExoPlayerImplInternal:源错误。网蝴蝶电视。rtmp_客户端。RtmpClient$RtmpIOException at net。蝴蝶电视。rtmp_客户端。R

  • 一旦我向concatenatingMediaSource添加一首歌,我就会在它旁边添加一个标签,所以我想知道如何通过这个特定的标签播放一首歌。 obs:ctd是歌曲位置的参考号;

  • 我正在尝试为ExoPlayer 2实现离线DRM支持,但我有一些问题。 我找到了这段对话。ExoPlayer 1有一些实现。以及如何使用ExoPlayer 2实现的一些步骤。十、 我对离线DrmSessionManager有问题,which实现了DrmSessionManager。在该示例中,是从ExoPlayer 1导入的DrmSessionManager。x、 如果我从ExoPlayer 2导

  • 我正在使用ExoPlayer播放视频的应用程序。出于某种原因,当我试图暂停时,视频播放器没有显示播放/暂停图标。我只为播放/暂停做了一个自定义布局,并将其设置在PlayerView上。使用或播放/暂停视频。到处都找不到解决办法,好像我错过了什么,但又不知道是什么。

  • 我无法使用exoplayer2.2离线播放歌曲。 这是我的密码。 我得到以下错误。 谁能帮忙吗。