ExoPlayer:某些受 PlayReady 保护的资产出现“内部运行时错误”

Posted

技术标签:

【中文标题】ExoPlayer:某些受 PlayReady 保护的资产出现“内部运行时错误”【英文标题】:ExoPlayer: "Internal runtime error" on certain PlayReady-protected assets 【发布时间】:2017-05-15 01:54:52 【问题描述】:

我正在开发一款适用于 android TV 设备的应用,它使用 ExoPlayer 作为视频播放器,并且我正在使用带有 PlayReady DRM 的平滑流式视频。该应用程序能够毫无问题地执行关键请求等,并且大部分内容正在播放。

但是,我在使用某些视频资产时遇到了问题。在 Logcat 中可以看到以下错误日志:

E/ExoPlayerImplInternal: Internal runtime error.
android.media.MediaCodec$CodecException: Error 0xffffffff
at android.media.MediaCodec.native_queueSecureInputBuffer(Native Method)
at android.media.MediaCodec.queueSecureInputBuffer(MediaCodec.java:2535)
at com.google.android.exoplayer.MediaCodecTrackRenderer.feedInputBuffer(MediaCodecTrackRenderer.java:721)
at com.google.android.exoplayer.MediaCodecTrackRenderer.doSomeWork(MediaCodecTrackRenderer.java:529)
at com.google.android.exoplayer.SampleSourceTrackRenderer.doSomeWork(SampleSourceTrackRenderer.java:128)
at com.google.android.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:432)
at com.google.android.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:211)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
at com.google.android.exoplayer.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40)

我知道相关资产可以正常工作,因为我们已在 Chromecast 上成功使用它们。

我对这个错误感到非常困惑,因为它只发生在某些资产上,而且它们之间似乎没有任何联系。任何帮助将不胜感激。

【问题讨论】:

您也可以在这里提交问题:github.com/google/ExoPlayer/issues 已经这样做了:github.com/google/ExoPlayer/issues/2275 【参考方案1】:

答案是由一位在 Nvidia SHIELD 设备上工作的 Nvidia 工程师here 发布的:

查看样本的唯一性,它无法在 Nvidia Shield 上运行的原因是加密样本的所有 IV 都归零。我们的 PlayReady 参考实现对此进行了限制,以避免“重播”攻击 (https://crypto.stackexchange.com/questions/8600/why-should-i-use-an-initialization-vector-iv-when-i-have-unique-keys),并且总是喜欢加盐 IV。 然而,后来人们意识到,如果密钥总是不同的并且在 CTR 模式下不重复,那么 IV 全部为零仍然足够安全。 (https://crypto.stackexchange.com/questions/8151/counter-mode-static-iv-but-different-keys)。此问题已修复,Nvidia Shield 的下一个 OTA 将修复此问题。

值得一提的是,上述 OTA 更新已经发布了半年多。

【讨论】:

以上是关于ExoPlayer:某些受 PlayReady 保护的资产出现“内部运行时错误”的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pssh 构建 PlayReady 对象

Chromecast 发件人作为 PlayReady 许可证提供者

带有许可证 URL 和令牌的 Playready 加密测试 SMOOTH 内容

Microsoft PlayReady DRM及其工作原理

在 Chromecast 上使用 PlayReady 许可进行流畅的流式传输

我在用命令禁用驱动强制签名提示设置元素数据出错。该值受安全策略保