我的.m3u8
应用中有一些加密(AES-128)Android
流,我想在ExoPlayer
中播放。我有这两个变量:
val secretKey = "a4cd9995a1aa91e1"
val initVector = "0000000000000000"
正如我在docs中阅读的,我需要将URI
和IV
参数添加到源文件中。添加后,我有下一个:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=AES-128,URI="data:text/plain;charset=utf-8,a4cd9995a1aa91e1",IV=0x30303030303030303030303030303030
#EXTINF:6.0,
media_b525000_0.ts
#EXTINF:6.0,
media_b525000_1.ts
#EXTINF:6.0,
media_b525000_2.ts
*other .ts segments...*
我在其中添加了两行:#EXT-X-DISCONTINUITY
和#EXT-X-KEY
。但是播放器不播放视频流,下一个例外是:
com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Malformed URL
我做错了什么?当我有secretKey
和initVector
时如何解密流?
[Exoplayer假定URI后面的所有内容都是m3u8文件中的实际URL,当它尝试使用下面的无效URL加载加密密钥时,上面的异常由OkHttpDataSource类抛出。
URI="data:text/plain;charset=utf-8,a4cd9995a1aa91e1"
此问题可以通过两种方式解决。1.将加密密钥放在服务器中,然后使用URL来获取它。2.根据您的需要,实现自定义数据源类并实现,拦截呼叫并修改请求/响应对象。
我也遇到过类似的问题,但就我而言,我有一个自定义方案而不是http。默认的OkHttpDataSource不处理自定义url方案,因此我不得不编写自己的数据源并进行拦截。