在exoplayer android中使用AES的在线加密流视频文件

aks*_*ane 5 encryption video-streaming exoplayer

我有使用存储在服务器上的AES加密的视频文件.如何在exoplayer中在线流式传输?我不想下载文件并解密它:等待下载完成然后播放解密文件.

Kyl*_*enn 3

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

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

如果您没有使用 ExoPlayer 2.0,则可以将 传递给DataSourceExtractorSampleSource然后传递给您实现的自定义的和VideoRenderer。(您也可以谷歌“自定义数据源 exoplayer”,如果我提供的内容不够,这应该会提供更多信息 - 或者如果您找不到任何内容,我可以澄清)。AudioRenderbuildRenderers()RendererBuilder

这是该方法的代码片段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;
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑] 还刚刚发现这个 SO 帖子有类似的建议。