我有一个非常大的(> 1 gb)加密文件,当我解密它时,我使用诸如
getByteArray(position,size)
这里的 position 决定了字节数组必须被提取的位置和大小。
现在我想播放接收到的字节数组 block 而不将它们写入存储中的文件,我尝试了CustomMediaDataSource
,但它在 api 23 以下不可用。
我尝试将它转换为 inputstream
但它给了我 OutOfMemoryException
有什么办法可以实现吗?
最佳答案
1) 您需要确保视频的格式/编码方式能够支持流式传输。对于 MP4 视频,moov 原子必须在任何 mdat 原子之前,但必须在 ftyp 原子之后。
2) 您需要确保所使用的加密支持对底层数据的随机访问。 AES/CTR/NoPadding 是一个应该起作用的例子。
3)
a) 您可以使用 libmedia (这是非免费的),或者基本上重新实现你自己的 libmedia,创建一个本地 ServerSocket,它使用 HTTP 来传输视频,并根据需要解密字节。这将适用于 VideoView 或 WebView。如果您想自己推出,请查看 http://stackoverflow.com/a/5432091/6585616有关如何创建服务器的示例。
或
b) 您可以使用 ExoPlayer ,并为其提供一个直接的数据源来处理动态解密。我在 github 上找到了一些支持这种加密的 exoplayer 实现代码 - https://github.com/moagrius/EncryptedExoPlayerDemo (麻省理工学院许可证)。
关于android - 从字节数组播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46938127/