我在服务器上存储了使用 AES 加密的视频文件。如何在 exoplayer 中在线播放它们?我不想下载文件并解密它:WAITING下载完成,然后播放解密的文件。
最佳答案
我建议查看 UriDataSource
或 DataSource
接口(interface)。您可以从 DataSource
派生并提供与 UriDataSource
非常相似的实现,并将其传递到 ExoPlayer。该类可以访问所有字节都经过的 read() 方法。该方法允许您一次解密一个缓冲区中的文件。
在 ExoPlayer 2.0 中,您可以从自己的自定义 DataSource.Factory
提供自己的自定义 DataSource
,该自定义 DataSource
可以传递给 ExtractorMediaSource
(或任何其他 MediaSource
)。
如果您没有使用 ExoPlayer 2.0,则将 DataSource
传递到 ExtractorSampleSource
,然后传递到 VideoRenderer
和 AudioRender
位于您实现的自定义 RendererBuilder
的 buildRenderers()
中。
(您也可以在 Google 上搜索“自定义数据源 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其中有类似的建议。
关于encryption - 在 exoplayer android 中使用 AES 在线加密流媒体视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44458093/