Экзоплеер с прероллом и динамической вставкой рекламы

Я хочу, чтобы мой DASH-поток работал с preroll и DAI. На данный момент я смог сделать: DASH + preroll работает и DASH + dai. Но не все три

тире + дай:

      val dashMediaSource = DashMediaSource.Factory(dashChunkSourceFactory, manifestDataSourceFactory)
            .createMediaSource(
                MediaItem.Builder()
                    .setUri(Uri.parse(URLDAI))  //diff
                    .setDrmConfiguration(
                        MediaItem.DrmConfiguration.Builder(drmSchemeUuid)
                            .setLicenseUri(DRM_LICENSE_URL).build()
                    )
                    .setMimeType(MimeTypes.APPLICATION_MPD)
                    .setTag(null)
                    .build()
            )

  playerView.setMediaSource(adsMediaSource)
    playerView.prepare()

тире + преролл

      val dashMediaSource = DashMediaSource.Factory(dashChunkSourceFactory, manifestDataSourceFactory)
            .createMediaSource(
                MediaItem.Builder()
                    .setUri(Uri.parse(URL))  //diff
                    .setDrmConfiguration(
                        MediaItem.DrmConfiguration.Builder(drmSchemeUuid)
                            .setLicenseUri(DRM_LICENSE_URL).build()
                    )
                    .setMimeType(MimeTypes.APPLICATION_MPD)
                    .setTag(null)
                    .build()
            )

val dataSpec = DataSpec(Uri.parse(PREROLL))
val imaSdkSettings = ImaSdkFactory.getInstance().createImaSdkSettings()
val imaAdsLoader = ImaAdsLoader.Builder(this).setImaSdkSettings(imaSdkSettings).build()
imaAdsLoader.setPlayer(playerView)
val adsMediaSource = AdsMediaSource(mediaSource, dataSpec, 0, DefaultMediaSourceFactory(this), imaAdsLoader, binding.playerView)
playerView.setMediaSource(adsMediaSource)
playerView.prepare()

Но если я комбинирую оба, я получаю:

      com.google.android.exoplayer2.upstream.Loader$UnexpectedLoaderException: Unexpected IllegalArgumentException: null

Как сделать, чтобы в exoplayer 2.18.1 работали все три: преролл+дай+даш (drm widevine)?

Спасибо

2 ответа

Это может не понравиться.setTag(null)часть; либо убери это, либо предоставьString.

И мне также кажется странным, что вы получаете доступplayerView...и неplayer; для сравнения:

      player.setMediaSource(adsMediaSource)
player.prepare()

К сожалению нет. Они заявили об этом здесь:https://developer.android.com/guide/topics/media/exoplayer/ad-insertion#:~:text=.release()-,Note,-%3A%20Currently%20only

Эти типы потоков несовместимы, но вы все равно можете комбинировать функции:

      val imaAdsMediaSource = AdsMediaSource(
    mediaSource, // original content source
    DataSpec(Uri.parse(url)), // ads url will handle preroll
    listOf(url, mediaSource.mediaItem.mediaId), // sample object ID
    DefaultMediaSourceFactory(context)
        .setLocalAdInsertionComponents({ loader }, // use the builder: ImaAdsLoader.Builder
            { view }) // default groupView
        .setServerSideAdInsertionMediaSourceFactory(
            adsSSAIMediaSourceFactory // use the factory: ImaServerSideAdInsertionMediaSource.Factory
        ),
    loader
) { view }

Поэтому, если вы хотите запрашивать рекламу (например, у бесплатных пользователей), используйте этот медиа-источник, если нет, просто сохраните исходный медиа-источник контента. Это единственная оболочка, которая помогла мне обработать различные типы источников, таких как Cronet, Hls, Dash, Akamai, Clippable и DRM.

Другие вопросы по тегам