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

标签 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 函数将给定的 key 和 iv 从十六进制字符串转换为 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 包私有(private)的。查看完整答案 github 。 您所要做的就是创建自己的数据源并自行实现解密。

“如果您可以创建一个数据源,该数据源将在请求的偏移量处返回正确解密的数据,那么 ExoPlayer 将“正常工作””

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

相关文章:

android - 通过点击通知判断app是否启动的方法

C# 加密生成 key

java - 如何使用 RSA 公钥加密 java.util.Properties 对象(可以是任意大小)?

Android响应汽车中的蓝牙音频按钮 - ExoPlayer

android - Google Play 实时多人游戏问题

java - 从 Firebase 实时数据库检索特定数据的最快方法?

ssl - TLS 1.2 change-cipher-spec 的 "decrypt error",但正确读取 MAC

android - 生成视频的DASH网址

exoplayer - 从后台线程还是从主 ui 线程使用 exoplayer 更好?

android - AsyncTask onPreExecute 未被调用