我有一个非常大的(> 1 gb)加密文件,当我解密它时,我使用
等方法获取块中的字节数组getByteArray(position,size)
此处position确定必须从中提取字节数组的位置以及大小。
现在我想播放字节数组块,这样收到而不将它们写入存储中的文件,我尝试了CustomMediaDataSource
但是它在api 23下面不可用。
我尝试将其转换为inputstream
,但它给了我OutOfMemoryException
有没有办法实现这一目标?
答案 0 :(得分:1)
1)您需要确保以支持流式传输的方式格式化/编码视频。对于MP4视频,moov原子必须在任何mdat原子之前,但必须接替ftyp原子。
2)您需要确保使用的加密支持对底层数据的随机访问。 AES / CTR / NoPadding是应该起作用的一个例子。
3)
a)您可以使用libmedia(非自由),或者基本上重新实现您自己的libmedia,创建一个本地ServerSocket,它使用HTTP来流式传输视频,并根据需要解密字节。这将适用于VideoView或WebView。如果您想自己推送,请查看http://stackoverflow.com/a/5432091/6585616以获取有关如何创建服务器的示例。
OR
b)您可以使用ExoPlayer,并为其提供直接处理解密的直接数据源。我在github上找到了支持这种加密的exoplayer实现的一些代码 - https://github.com/moagrius/EncryptedExoPlayerDemo。请注意,存储库当前未经许可,因此您不能只复制/粘贴。