我现在正在尝试播放具有自己逻辑的加密视频(mp4)。播放解码后的文件需要太多时间,因为它太大了,无法创建和播放。因此,我发现如何在使用ExoPlayer使用InputStream对其进行解密的同时播放它。但就我而言,应用它太困难了。当我担心两天时,我度过了一个夜晚,但仍然看不到任何结果。所以我在这里寻求帮助。
我正在寻找的参考可能会有所帮助。我必须接受并解码缓冲区大小(4096)。我不知道在哪里写这段代码。
我认为完成该功能的流程如下。 1.完成ExoPlayer UI。 2.使用我的加密逻辑对下载的文件进行加密。 (缓冲区大小为4096) 3. InputStream接收文件,同时对其进行解码并播放。 (流式传输)
我会一直做到1和2,但是3对我来说很难。您有任何特定的代码和解释吗?如果您认识任何人,请帮我一个忙。谢谢。
try {
ios = new FileInputStream(params[0]);
fos = context.openFileOutput(params[1] + ".mp4", MODE_PRIVATE);
ScatteringByteChannel sbc = ios.getChannel();
GatheringByteChannel gbc = fos.getChannel();
File file = new File(params[0]);
fileLength = file.length();
startTime = System.currentTimeMillis();
int read = 0;
readb = 0;
ByteBuffer bb = ByteBuffer.allocate(4096);
while ((read = sbc.read(bb)) != -1) {
bb.flip();
gbc.write(ByteBuffer.wrap(enDecryptVideo.combineByteArray(bb.array())));
bb.clear();
readb += read;
if (readb % (4096 * 1024 * 3) == 0){
publishProgress(((int) ( readb * 100 / fileLength)));
} else if (readb == fileLength) {
publishProgress(101);
}
}
ios.close();
fos.close();
} catch (Exception e) {
e.getMessage();
} finally {
Log.d(TAG, "doInBackground: " + (System.currentTimeMillis() - startTime));
}
这是我使用文件播放时的代码。上面的代码是我制作解码文件并播放时使用的代码。现在,我必须在解码的同时播放。它不会创建文件。我很渴望因为自开始工作以来我已经工作了一个月,但是我收到的东西与我的水平不符。但是我真的很想实现这个目标...请教我。
答案 0 :(得分:1)
实际上,您可以使用商业DRM或“明码”加密,利用平台内置的加密功能来处理流式视频。
如果这些能够满足您的需求,则使用起来会容易得多,因为您不必自己实现加密和解密。
此答案提供了创建HLS / AES流和DASH清除键流的示例:
由于密钥本身未加密,因此不能提供与DRM相同的安全性,但是它可能足以满足您的需求。
然后可以使用标准的iOS,Android或HTML5播放器播放这些流。