2

ローカルの aes128-cbc で暗号化された mp3 ファイルを ExoPlayer で再生するのが最善の方法だと思います。その目的のために存在すると思われる Aes128DataSource クラスがありますが、ExoPlayer でファイルを再生できません。ファイルが何らかの形で破損していることを示すトラック継続時間として常に -1 を返します。ログには何も記録されていないため、エラーの内容に関する情報はあまりありません。mp3は再生されません。ファイルが正しく復号化されていないと思います。誰かがそれを行う方法の例を挙げてもらえますか? これが私がすることです:

キーと iv:

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

指定されたキーと iv を 16 進文字列からバイト [] に変換する hexToBytes 関数:

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);
4

2 に答える 2