将ExoPlayer Input流与自己的加密逻辑结合使用

时间:2018-07-16 13:24:24

标签: android video streaming exoplayer

我现在正在尝试播放具有自己逻辑的加密视频(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));
    }

这是我使用文件播放时的代码。上面的代码是我制作解码文件并播放时使用的代码。现在,我必须在解码的同时播放。它不会创建文件。我很渴望因为自开始工作以来我已经工作了一个月,但是我收到的东西与我的水平不符。但是我真的很想实现这个目标...请教我。

1 个答案:

答案 0 :(得分:1)

实际上,您可以使用商业DRM或“明码”加密,利用平台内置的加密功能来处理流式视频。

如果这些能够满足您的需求,则使用起来会容易得多,因为您不必自己实现加密和解密。

此答案提供了创建HLS / AES流和DASH清除键流的示例:

由于密钥本身未加密,因此不能提供与DRM相同的安全性,但是它可能足以满足您的需求。

然后可以使用标准的iOS,Android或HTML5播放器播放这些流。