Вопрос или проблема
В 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) и пользовательского кода для управления вставкой рекламы. Ваша текущая реализация, где реклама воспроизводится только в начале (преролл), может быть расширена для включения промежуточной рекламы и повторного воспроизведения.
Решение: Воспроизведение рекламы в заданные моменты
-
Настройка рекламы: Наиболее распространенный подход — это использование
AdsLoader
вместе сAdViewProvider
. Убедитесь, что вы правильно настроили ссылку на ваш adTagUrl.Примерно так, как у вас сделано:
val adTagUri = Uri.parse(getString(R.string.ad_tag_url))
-
Управление временем для вставки рекламы: Чтобы воспроизводить рекламу в определенные моменты видео, необходимо использовать слушатель событий
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()) } })
-
Множественное воспроизведение рекламы: Чтобы вставлять рекламу несколько раз в течение длительного видео, вы можете модифицировать вышеуказанный код так, чтобы следить за текущей позицией и при достижении необходимых временных меток вызывать метод
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
при перемотке назад или перезапуске видео, чтобы реклама могла воспроизводиться повторно при необходимости.
Эта реализация поможет вам более гибко управлять рекламой в ваших приложениях и улучшит опыт пользователей, позволяя им получать контент, продвигаемый рекламодателями.