10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class CustomMediaDrmCallback( private val licenseUrl: String, private val authToken: String, ) : MediaDrmCallback { override fun executeProvisionRequest( uuid: UUID, request: ExoMediaDrm.ProvisionRequest ): ByteArray { // プロビジョニングはWidevineサーバーへ直接 return HttpUtil.executePost( request.defaultUrl, request.data, emptyMap() ) } override fun executeKeyRequest( uuid: UUID, request: ExoMediaDrm.KeyRequest ): ByteArray { // 自社Proxy Serverへライセンスリクエストを送信 val headers = mapOf( "Authorization" to "Bearer $authToken", "Content-Type" to "application/octet-stream" ) return HttpUtil.executePost( licenseUrl, request.data, headers ) } } Widevineサーバーへ のリクエスト デバイス証明証 の発行 プロキシサーバーへ のリクエスト 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fun buildDrmSessionManager( licenseUrl: String, authToken: String, ): DrmSessionManager { val callback = CustomMediaDrmCallback( licenseUrl = licenseUrl, authToken = authToken, ) return DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider( C.WIDEVINE_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER ) .setMultiSession(false) .build(callback) }