Online encrypted streaming video files with AES in exoplayer android

时间:2017-06-09 12:39:13

标签: encryption video-streaming exoplayer

I have video files encrypted with AES stored on server. How to stream them online in exoplayer? I don't want to download the file and decrypt it: waiting for the download to complete and then play decrypted file.

1 个答案:

答案 0 :(得分:2)

我建议您查看UriDataSourceDataSource界面。您可以从DataSource派生,并提供与UriDataSource非常相似的实现,并将其传递给ExoPlayer。该类可以访问所有字节都通过的read()方法。该方法允许您一次解密文件中的文件。

在ExoPlayer 2.0中,您可以从自己的自定义DataSource提供自己的自定义DataSource.Factory,可以将其传递给ExtractorMediaSource(或任何其他MediaSource)。

如果您不在ExoPlayer 2.0上,则将DataSource传递给ExtractorSampleSource,然后传递到VideoRendererAudioRender中的buildRenderers()您实现的自定义RendererBuilder。 (你也可以谷歌“自定义数据源exoplayer”,如果我提供的内容不够,那么应该提供更多信息 - 或者我可以澄清你是否找不到任何东西)。

以下是read()方法的代码段:

@Override
public int read(byte[] buffer, int offset, int readLength) throws IOException {
    if (bytesRemaining == 0) {
        return -1;
    } else {
        int bytesRead = 0;
        try {
            long filePointer = randomAccessFile.getFilePointer();
            bytesRead =
                    randomAccessFile.read(buffer, offset, (int) Math.min(bytesRemaining, readLength));
            // Supply your decrypting logic here
            AesEncrypter.decrypt(buffer, offset, bytesRead, filePointer);
        } catch (EOFException eof) {
            Log.v("Woo", "End of randomAccessFile reached.");
        }

        if (bytesRead > 0) {
            bytesRemaining -= bytesRead;
            if (listener != null) {
                listener.onBytesTransferred(bytesRead);
            }
        }
        return bytesRead;
    }
}

[编辑]也刚刚找到了this SO post,它有类似的建议。