簡體   English   中英

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

[英]Play local aes128 cbc encrypted mp3 with ExoPlayer

我想知道使用 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 從十六進制字符串轉換為字節 []:

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 將“正常工作””

我剛剛發布了一個不同但類似的問題的答案,可能會解決您的問題。 您需要創建一個在開始時跳過密碼流的自定義數據源,並且密碼需要自我更新以使用前一個塊的密文作為 IV 從任意位置開始解密等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM