在 ExoPlayer 中播放加密视频文件时遇到问题,超过几秒钟

Having trouble playing encrypted video files in ExoPlayer, longer than a couple seconds

我正在尝试通过 ExoPlayer 播放我在我的应用程序中加密的视频文件,但是每当我尝试播放超过几秒钟的视频时,视频将无法播放。

我正在使用“AES/GCM/NoPadding”加密方式对媒体进行加密。

下面是我使用 Exoplayer 播放加密流的自定义数据源 class:

class EncryptedDataSource(
    private val context: Context,
    private val datasource: DataSource,
    private val secureKey: String
) : DataSource {

    private var cipherInputStream: CipherInputStream? = null

    private var uri: Uri? = null

    override fun addTransferListener(transferListener: TransferListener?) {}

    override fun open(dataSpec: DataSpec?): Long {
        uri = dataSpec?.uri

        val encryptedFile = File(context.filesDir, secureKey)
        val inputStream = encryptedFile.inputStream()
        val cipher = EncryptUtils.getCipherForEncryptedStream(secureKey)
        cipherInputStream = CipherInputStream(inputStream, cipher)
        
        return C.LENGTH_UNSET.toLong()
    }

    override fun read(buffer: ByteArray?, offset: Int, readLength: Int): Int {
        Assertions.checkNotNull<Any>(cipherInputStream)

        val bytesRead = cipherInputStream?.read(buffer, offset, readLength) ?: 0

        return if (bytesRead < 0) {
            C.RESULT_END_OF_INPUT
        } else {
            bytesRead
        }
    }

    override fun getUri(): Uri? = uri

    @Throws(IOException::class)
    override fun close() {
        if (cipherInputStream != null) {
            cipherInputStream?.close()
            cipherInputStream = null
            datasource.close()
        }
    }
}

当我播放一个 2/3 秒长的视频时,一切正常,并且可以播放视频。如果视频不再播放,我就会陷入循环,调用 open() 函数,然后多次调用 read() 函数,最后调用 close() 函数。然后 open() 函数在之后立即被调用,并继续循环。

有人对我哪里出错有什么建议吗?我知道 encryption/decryption 逻辑可以正常工作,因为我已经测试过在 ExoPlayer 外部加密和解密视频很好,而且我知道 2/3 秒的短视频也可以正常工作。

感谢以下博客:

http://blog.moagrius.com/android/android-play-encrypted-video-in-exoplayer/

我能够解决我的问题。