我有一个加密的 (128-AES-CTR-NoPadding) 视频驻留在服务器上,我需要在下载时对其进行解密,以便用户可以流式传输它(在普通播放器/网络中)。
我了解此解决方案的组成部分以及应如何将它们组合在一起以使其发挥作用。它部分有效,但对于其余部分,我无法正确实现流式传输。在过去的一周里,我一直在阅读和学习示例(其中大部分是在磁盘上播放文件,这里不是这种情况),并得出结论这超出了我的范围,我需要一些帮助。
细节
我使用轻量级网络服务器 ( nanoHttpd ) 作为代理从远程服务器下载加密数据并提供解密数据。下面是我的 NanoHTTPD.serve 方法中的主要代码。
//create urlConnection to encrypted video file with proper headers (ie range headers) as request received by the proxy server
InputStream inputStream = new CipherInputStream(cipher, urlConnection.getInputStream());
return newChunkedResponse(status, contentType,inputStream);
所以现在如果我转到我的 NanoHttpd 网络服务器 ( http://localhost:9000 ),文件将开始下载,下载完成后,文件将按预期完全解密和播放。因此,这确保了从服务器获取加密数据和提供解密数据的工作正常。但是当要求任何视频播放器(html5、vlc)从该 url 流式传输视频时,它根本不起作用。
如果将 NanoHTTPD.serve 中的上述代码更改为
//create urlConnection to cleardata video file with proper headers (ie range headers) as request received by the proxy server
InputStream inputStream = urlConnection.getInputStream();
return newChunkedResponse(status, contentType,inputStream);
然后尝试从上述播放器流式传输,它会工作得很好。因此,这可确保 Web 代理正确检索和提供数据。
潜在问题 为了支持来自视频播放器的范围请求,我们需要正确地跳到块边界,该块边界是密码块大小的倍数。因此,当视频播放器请求带有标头(范围:字节 34-44)的数据时,CipherInputStream 可能无法解密数据,因为输入流具有来自 34-44 的数据。但是我不知道如何使用 urlConnection.getInputStream() 和 CipherInputStream 来做到这一点。
但即使没有这个,它至少应该开始播放前几秒,因为视频播放器发送的第一个请求是(范围:0-),这意味着 inputStream 从索引 0 开始,因此 CipherInputStream 应该能够解密并提供这些初始字节和视频应继续播放。
我完全不知所措,因为我不知道如何调试它。欢迎任何想法,示例代码,我会尝试并在此处发布结果。
小怪兽爱吃肉
相关分类