使用ExoPlayer播放本地aes128 cbc加密mp3

时间:2015-07-23 15:43:55

标签: android encryption exoplayer

我想知道用ExoPlayer播放本地aes128-cbc加密mp3文件的最佳方法是什么。有一个Aes128DataSource类似乎存在,但我无法让ExoPlayer播放该文件。它始终返回-1作为轨道持续时间,表示文件以某种方式损坏。由于日志中没有任何内容,因此没有太多关于错误的信息。 mp3只是没有播放。我猜文件没有正确解密。有人能举例说明怎么做吗? 这是我的工作:

Key和iv:

private byte[] iv = hexToBytes("..."); //32 hex symbols here as String
private byte[] key = hexToBytes("..."); //32 hex symbols here as String

hexToBytes函数,它将给定的密钥和iv从hex String转换为byte []:

private byte[] hexToBytes(String str) {
    if (str == null) {
        return null;
    }
    else if (str.length() < 2) {
        return null;
    }
    else {
        int len = str.length() / 2;
        byte[] buffer = new byte[len];
        for (int i = 0; i < len; i++) {
            buffer[i] = (byte) Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
        }
        return buffer;
    }
}

在这里我要播放加密文件:

Uri uri = Uri.parse("android.resource://" + context.getPackageName() + File.separator + R.raw.track01_cbc);
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
String userAgent = getUserAgent(context, ...);
DataSource dataSource = new DefaultUriDataSource(context, bandwidthMeter, userAgent);
Aes128DataSource aes128DataSource = new Aes128DataSource(dataSource, key, iv);
SampleSource sampleSource = new ExtractorSampleSource(uri, aes128DataSource, new Mp3Extractor(), RENDERER_COUNT, 5000);
MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
exoPlayer.prepare(audioRenderer);
exoPlayer.setPlayWhenReady(true);

2 个答案:

答案 0 :(得分:1)

根据ExoPlayer的开发人员的说法,Aes128DataSource仅作为使用HLS流的一部分。在ExoPlayer的下一个版本中,Aes128DataSource将专用于HLS包。查看github的完整答案。 您需要做的是创建自己的DataSource并自己实现解密。

&#34;如果您可以创建一个DataSource,它将在请求的偏移量下正确地返回解密数据,那么ExoPlayer将只是工作&#34;&#34;

答案 1 :(得分:0)

我只是posted an answer回答了一个可能解决您问题的不同但相似的问题。您需要创建一个自定义的数据源,该数据源在开始时会跳过密码流,并且密码需要进行自我更新以使用上一个块的密文作为IV,以便从任意位置开始解密。