具有预卷和动态广告插入功能的Exoplayer

问题描述 投票:0回答:2

我想通过预卷和 DAI 来使用我的 DASH 流。目前,我能够实现: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 中同时实现这三个功能:preroll + dai + dash ( drm Widevine)?

谢谢

android exoplayer exoplayer2.x preroll
2个回答
0
投票

它可能不喜欢

.setTag(null)
部分;删除它或提供
String

我也觉得很奇怪,你访问

playerView
......而不是
player
;比较:

player.setMediaSource(adsMediaSource)
player.prepare()

0
投票

不幸的是没有。他们在这里声明: https://developer.android.com/guide/topics/media/exoplayer/ad-insertion#:~:text=.release()-,注意,-%3A%20当前仅%20

这些流类型不兼容,但您仍然可以组合这些功能:

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

© www.soinside.com 2019 - 2024. All rights reserved.