Экзоплеер с прероллом и динамической вставкой рекламы
Я хочу, чтобы мой 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.