Android 加密密钥不可用-ExoPlayer
因此,我试图播放Dash文件(.mpd)中的加密内容,该文件用Shaka Packager打包,并用CENC方法加密。媒体在Shaka播放器上的播放效果绝对不错,但我无法在Android的ExoPlayer上播放。播放时,Logcat显示以下错误:Android 加密密钥不可用-ExoPlayer,android,exoplayer,mpeg-dash,exoplayer2.x,Android,Exoplayer,Mpeg Dash,Exoplayer2.x,因此,我试图播放Dash文件(.mpd)中的加密内容,该文件用Shaka Packager打包,并用CENC方法加密。媒体在Shaka播放器上的播放效果绝对不错,但我无法在Android的ExoPlayer上播放。播放时,Logcat显示以下错误: Caused by: android.media.MediaCodec$CryptoException: Crypto key not available at android.media.MediaCodec.native_queueSec
Caused by: android.media.MediaCodec$CryptoException: Crypto key not available
at android.media.MediaCodec.native_queueSecureInputBuffer(Native Method)
at android.media.MediaCodec.queueSecureInputBuffer(MediaCodec.java:2699)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:1188)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:719)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:237)
at android.os.HandlerThread.run(HandlerThread.java:67)
Gradle的最小Sdk限制为API 21,因此可以签出,使用的代码是:
player = new SimpleExoPlayer.Builder(this).build();
ep.setPlayer(player);
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "AppName"));
Uri uri = Uri.parse(Tools.baseAddress+"VIDEO/"+i.getStringExtra("ModuleID")+"/index.php").buildUpon().appendQueryParameter("token", Tools.token).build();
String keyString = "{\"keys\":[{\"kty\":\"oct\",\"k\":\"76a6c65c5ea762046bd749a2e632ccbb\",\"kid\":\"a7e61c373e219033c21091fa607bf3b8\"}],'type':\"temporary\"}";
LocalMediaDrmCallback drmCallback = new LocalMediaDrmCallback(keyString.getBytes());
DrmSessionManager manager=null;
manager = new DefaultDrmSessionManager.Builder()
.setPlayClearSamplesWithoutKeys(true)
.setMultiSession(false)
.setUuidAndExoMediaDrmProvider(C.CLEARKEY_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER)
.build(drmCallback);
MediaSource dashMediaSource = new DashMediaSource.Factory(dataSourceFactory).setDrmSessionManager(manager).createMediaSource(uri);
player = new SimpleExoPlayer.Builder(this).build();
ep.setPlayer(player);
player.prepare(dashMediaSource);
使用Shaka Packager打包MP4视频时使用的命令是:
.\packager input=videoplayback.mp4,stream=video,output=video.mp4 input=videoplayback.mp4,stream=audio,output=audio.mp4 --enable_raw_key_encryption --keys key_id=a7e61c373e219033c21091fa607bf3b8:key=76a6c65c5ea762046bd749a2e632ccbb --clear_lead 0 --mpd_output dash.mpd
我不确定密钥格式是否正确,或者DRM会话管理器是否正确初始化。
如果有任何帮助,我将不胜感激。
提前感谢。最可能的原因是LocalMediaDrmCallback方法希望密钥和密钥id采用base64url编码 您可以使用以下在线工具将您的密钥和密钥id转换为:
您也可以在GitHub问题讨论中看到一个编程示例:我花了很长时间研究“CryptoKey not available”异常 我发现这个例外发生在一些错误的事情上