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.
答案 0 :(得分:2)
我建议您查看UriDataSource
或DataSource
界面。您可以从DataSource
派生,并提供与UriDataSource
非常相似的实现,并将其传递给ExoPlayer。该类可以访问所有字节都通过的read()
方法。该方法允许您一次解密文件中的文件。
在ExoPlayer 2.0中,您可以从自己的自定义DataSource
提供自己的自定义DataSource.Factory
,可以将其传递给ExtractorMediaSource
(或任何其他MediaSource
)。
如果您不在ExoPlayer 2.0上,则将DataSource
传递给ExtractorSampleSource
,然后传递到VideoRenderer
和AudioRender
中的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,它有类似的建议。