问题
DRM保护视频成功下载到本地存储。当尝试从本地存储播放视频时,exo-player会抛出DRMSession错误,如下所述。是否有方法调试DRM,找出其“恢复键失败”的原因?
预期结果
本地下载应正确播放
ExoPlayer版本
2.14.2
再现问题的设备
异常日志
E/DefaultDrmSession: DRM session error
java.lang.IllegalArgumentException: Failed to restore keys
at android.media.MediaDrm.restoreKeys(Native Method)
at com.google.android.exoplayer2.drm.FrameworkMediaDrm.restoreKeys(FrameworkMediaDrm.java:262)
at com.google.android.exoplayer2.drm.DefaultDrmSession.restoreKeys(DefaultDrmSession.java:437)
at com.google.android.exoplayer2.drm.DefaultDrmSession.doLicense(DefaultDrmSession.java:401)
at com.google.android.exoplayer2.drm.DefaultDrmSession.acquire(DefaultDrmSession.java:294)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.createAndAcquireSession(DefaultDrmSessionManager.java:775)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.createAndAcquireSessionWithRetry(DefaultDrmSessionManager.java:684)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.acquireSession(DefaultDrmSessionManager.java:563)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.acquireSession(DefaultDrmSessionManager.java:510)
at com.google.android.exoplayer2.source.SampleQueue.onFormatResult(SampleQueue.java:918)
at com.google.android.exoplayer2.source.SampleQueue.peekSampleMetadata(SampleQueue.java:686)
at com.google.android.exoplayer2.source.SampleQueue.read(SampleQueue.java:412)
at com.google.android.exoplayer2.source.chunk.ChunkSampleStream.readData(ChunkSampleStream.java:398)
at com.google.android.exoplayer2.BaseRenderer.readSource(BaseRenderer.java:395)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:996)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:830)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:945)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:478)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:223)
at android.os.HandlerThread.run(HandlerThread.java:67)
E/VideoDisplayComponent: onDrmSessionManagerError
java.lang.IllegalArgumentException: Failed to restore keys
at android.media.MediaDrm.restoreKeys(Native Method)
at com.google.android.exoplayer2.drm.FrameworkMediaDrm.restoreKeys(FrameworkMediaDrm.java:262)
at com.google.android.exoplayer2.drm.DefaultDrmSession.restoreKeys(DefaultDrmSession.java:437)
at com.google.android.exoplayer2.drm.DefaultDrmSession.doLicense(DefaultDrmSession.java:401)
at com.google.android.exoplayer2.drm.DefaultDrmSession.acquire(DefaultDrmSession.java:294)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.createAndAcquireSession(DefaultDrmSessionManager.java:775)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.createAndAcquireSessionWithRetry(DefaultDrmSessionManager.java:684)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.acquireSession(DefaultDrmSessionManager.java:563)
at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.acquireSession(DefaultDrmSessionManager.java:510)
at com.google.android.exoplayer2.source.SampleQueue.onFormatResult(SampleQueue.java:918)
at com.google.android.exoplayer2.source.SampleQueue.peekSampleMetadata(SampleQueue.java:686)
at com.google.android.exoplayer2.source.SampleQueue.read(SampleQueue.java:412)
at com.google.android.exoplayer2.source.chunk.ChunkSampleStream.readData(ChunkSampleStream.java:398)
at com.google.android.exoplayer2.BaseRenderer.readSource(BaseRenderer.java:395)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:996)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:830)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:945)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:478)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:223)
at android.os.HandlerThread.run(HandlerThread.java:67)
发布于 2022-06-24 19:05:14
首先请注意--您需要确保您的DRM许可证支持离线播放或持久性。您的DRM提供者应该能够帮助确认或配置这一点。
假设是这样的,那么ExoPlayer要求您使用OfflineLicenseHelper来管理离线许可证。
在ExoPlayer的GitHub演示代码中有一个最新的示例-查看:https://github.com/google/ExoPlayer/blob/03569f9e6536e6c60cb585115d6d7352a4deab71/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
(ExoPlayer/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java /)
如果您查看“WidevineOfflineLicenseFetchTask”,您可以看到离线许可的同步获取:
protected Void doInBackground(Void... voids) {
OfflineLicenseHelper offlineLicenseHelper =
OfflineLicenseHelper.newWidevineInstance(
drmConfiguration.licenseUri.toString(),
drmConfiguration.forceDefaultLicenseUri,
dataSourceFactory,
drmConfiguration.licenseRequestHeaders,
new DrmSessionEventListener.EventDispatcher());
try {
keySetId = offlineLicenseHelper.downloadLicense(format);
} catch (DrmSession.DrmSessionException e) {
drmSessionException = e;
} finally {
offlineLicenseHelper.release();
}
return null;
}
https://stackoverflow.com/questions/72616303
复制相似问题