Проигрывайте рекламу в определённые моменты видео в ExoPlayer

Вопрос или проблема

В Android (kotlin) я использую ExoPlayer 2.18.1 для потоковой передачи фильмов, и чтобы добавить рекламу в эти фильмы, я использовал расширение IMA adsLoader для загрузки и воспроизведения рекламы, в настоящее время я использую только тестовый adTagUrl, и реклама воспроизводится перед началом видео (преролл).

Есть ли способ воспроизводить рекламу в определенное время видео? Например, я хочу воспроизвести рекламу через 60 секунд после начала видео.

Еще одна вещь, которую я не могу реализовать, это воспроизводить рекламу несколько раз. У меня есть несколько длинных видео, и я хочу показывать на них несколько реклам.

Я искал способы вручную загружать и запускать рекламу, но не смог ничего найти.

Вот мой текущий код для потоковой передачи фильмов и внедрения в них рекламы:

val trackSelectorParameters = DefaultTrackSelector.ParametersBuilder(this).build()
        val trackSelector = DefaultTrackSelector(this)
        trackSelector.parameters = trackSelectorParameters
        videoUrl = playerData.url
        val videoUri = Uri.parse(videoUrl)
        val adTagUri = Uri.parse(getString(R.string.ad_tag_url))

        mediaItem = MediaItem.Builder()
            .setUri(videoUri)
            .setAdsConfiguration(AdsConfiguration.Builder(adTagUri).build())
            .build()

        player = ExoPlayer.Builder(this)
            .setTrackSelector(trackSelector)
            .build()
        adsLoader!!.setPlayer(player)

        activityPlayerBinding.playerView.player = player
        player!!.trackSelectionParameters = player!!.trackSelectionParameters
            .buildUpon()
            .setMaxVideoSizeSd()
            .setPreferredAudioLanguage("hu")
            .build();
        player!!.addListener(PlayerEventListener(this))
        activityPlayerBinding.playerView.setControllerVisibilityListener {
            if(it == 0) activityPlayerBinding.playerOptions.visibility = View.VISIBLE
            else activityPlayerBinding.playerOptions.visibility = View.GONE
        }

        mediaSource = DefaultMediaSourceFactory(this)
            .setAdsLoaderProvider { adsLoader }
            .setAdViewProvider(playerView)
            .createMediaSource(mediaItem)
        player?.let {
            it.setMediaSource(mediaSource)
            it.seekTo(TimeUnit.SECONDS.toMillis(viewModel.playerVideoData.value!!.duration.toLong()))
            it.prepare()
            it.play()
        }

Ответ или решение

Для реализации воспроизведения рекламы в определенные моменты видео в ExoPlayer, вы можете использовать комбинацию IMA (Interactive Media Ads) и пользовательского кода для управления вставкой рекламы. Ваша текущая реализация, где реклама воспроизводится только в начале (преролл), может быть расширена для включения промежуточной рекламы и повторного воспроизведения.

Решение: Воспроизведение рекламы в заданные моменты

  1. Настройка рекламы: Наиболее распространенный подход — это использование AdsLoader вместе с AdViewProvider. Убедитесь, что вы правильно настроили ссылку на ваш adTagUrl.

    Примерно так, как у вас сделано:

    val adTagUri = Uri.parse(getString(R.string.ad_tag_url))
  2. Управление временем для вставки рекламы: Чтобы воспроизводить рекламу в определенные моменты видео, необходимо использовать слушатель событий Player.Listener, позволяющий отслеживать время воспроизведения. Например, если вы хотите воспроизвести рекламу через 60 секунд после начала, добавьте следующий код:

    player.addListener(object : Player.Listener {
       private var adPlayed = false  // Флаг, чтобы проверять, была ли реклама уже показана
    
       override fun onPlaybackStateChanged(playbackState: Int) {
           if (playbackState == Player.STATE_READY && !adPlayed) {
               val currentPosition = player.currentPosition
               if (currentPosition >= 60000) { // 60 секунд = 60000 мс
                   loadAd()
                   adPlayed = true // Устанавливаем флаг, чтобы рекламировать только один раз
               }
           }
       }
    
       private fun loadAd() {
           adsLoader?.loadAd(AdLoadOptions.Builder().build())
       }
    })
  3. Множественное воспроизведение рекламы: Чтобы вставлять рекламу несколько раз в течение длительного видео, вы можете модифицировать вышеуказанный код так, чтобы следить за текущей позицией и при достижении необходимых временных меток вызывать метод loadAd().

    Например, можно создать массив с интервалами, на которых вы хотите воспроизводить рекламу:

    private val adIntervals = listOf(60000, 120000, 180000) // Реклама через 60, 120 и 180 секунд
    
    override fun onPlaybackStateChanged(playbackState: Int) {
       if (playbackState == Player.STATE_READY) {
           val currentPosition = player.currentPosition
           for (interval in adIntervals) {
               if (currentPosition >= interval && !adPlayed) {
                   loadAd()
                   adPlayed = true
                   break
               }
           }
       }
    }

Итог

Таким образом, используя Player.Listener, вы можете контролировать момент появления рекламы в видео и запускать её в заданные вами временные интервалы. Не забудьте сбрасывать флаг adPlayed при перемотке назад или перезапуске видео, чтобы реклама могла воспроизводиться повторно при необходимости.

Эта реализация поможет вам более гибко управлять рекламой в ваших приложениях и улучшит опыт пользователей, позволяя им получать контент, продвигаемый рекламодателями.

Оцените материал
Добавить комментарий

Капча загружается...