我想知道最好的方法是用ExoPlayer播放本地aes128-cbc加密的mp3文件。有一个类Aes128DataSource似乎为此目的而存在,但是我无法让ExoPlayer播放该文件。它始终返回-1作为跟踪持续时间,这表明文件某种程度上已损坏。没有太多关于错误原因的信息,因为日志中没有任何内容。 mp3只是无法播放。我猜该文件未正确解密。有人可以举一个例子吗?
这是我的工作:

关键和四:

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


hexToBytes函数将给定的键和iv从十六进制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);

最佳答案

根据ExoPlayer的开发人员所说,Aes128DataSource仅作为使用HLS流的一部分。在下一版本的ExoPlayer中,Aes128DataSource将对HLS包私有。查看github的完整答案。
您要做的就是创建自己的数据源并自己实现解密。

“如果您可以创建一个将按要求的偏移量返回正确解密的数据的数据源,则ExoPlayer将“正常工作””

关于android - 使用ExoPlayer播放本地aes128 cbc加密的mp3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31592158/

10-12 03:11