我想通过预卷和 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)?
谢谢
它可能不喜欢
.setTag(null)
部分;删除它或提供 String
。
我也觉得很奇怪,你访问
playerView
......而不是player
;比较:
player.setMediaSource(adsMediaSource)
player.prepare()
不幸的是没有。他们在这里声明: 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