Problem of play Encrypted Audio in Exoplayer

Viewed 50

I use Exoplayer to play encrypted audio. I create ecryptyedDataSourceFacotory and I tried to play encrypted audio. it's working fine even when seek to forward position but when seek to back position, sound does not play.

how can I fix it?.

below code is EncryptedDataSource and added to Exoplayer. Some code is unused because I tried some way to solve this problem.

class EncryptedDataSource(private val context: Context, var fileName: String) : DataSource {
companion object {
    const val AES_BLOCK_SIZE = 16
}


private var inputStream: FileInputStream? = null
private lateinit var uri: Uri
private var dataSpec: DataSpec? = null
private val transferListeners = mutableListOf<TransferListener?>()
private var mBytesRemaining: Long = 0
private var isOpen = false

override fun addTransferListener(transferListener: TransferListener?) {
    transferListeners.add(transferListener)
}

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

    if (isOpen) return mBytesRemaining

    setupInputStream()
    skipToPosition(dataSpec)
    computeBytesRemaining(dataSpec)
 
    isOpen = true
    transferListeners.forEach { it?.onTransferStart(this, dataSpec, false) }

    return dataSpec?.length ?: 0L
}

override fun read(buffer: ByteArray?, offset: Int, readLength: Int): Int {
    if (readLength == 0)
        return C.RESULT_END_OF_INPUT
    else return inputStream?.read(buffer, offset, readLength) ?: 0
}

override fun getUri(): Uri? {
    return uri
}

override fun close() {
    inputStream?.close()
}

private fun computeBytesRemaining(dataSpec: DataSpec) {
    if (dataSpec.length.toInt() != C.LENGTH_UNSET) {
        mBytesRemaining = dataSpec.length;
    } else {
        mBytesRemaining = inputStream?.available()?.toLong() ?: 0L
        if (mBytesRemaining.toInt() == Integer.MAX_VALUE) {
            mBytesRemaining = C.LENGTH_UNSET.toLong()
        }
    }
}

private fun setupInputStream(){
    val masterKeyAlias: String = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

    val file = File(context.getExternalFilesDir(Environment.DIRECTORY_MUSIC), fileName)

    val encryptedFile: EncryptedFile = EncryptedFile.Builder(
        file!!,
        context,
        masterKeyAlias,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
    ).build()

    inputStream = encryptedFile.openFileInput()
}

private fun skipToPosition(dataSpec: DataSpec) {
    inputStream?.forceSkip(dataSpec.position)
}
}
0 Answers
Related