安卓手机APP开发__媒体开发部分__媒体源

发布于:2024-04-23 ⋅ 阅读:(67) ⋅ 点赞:(0)

安卓手机APP开发__媒体开发部分__媒体源

目录

概述

定制媒体源的创建

基于播放列表的API的媒体源

高级的媒体源的组合


概述

在ExoPlayer,媒体的每一个部分都能表示为一个媒体项。
然而内部来看,播放器需要媒体源的实例来播放内容。
播放器使用一个媒体源的工厂从媒体项来创建了这些实例。

默认上,播放器使用DefaultMediaSourceFactory,它能创建如下的
内容媒体源的实现:

对于DASH有DASH的媒体源
对于光滑流有SsMediaSource
对于HLS有HlsMediaSource
对于常规的媒体文件,有ProgressiveMediaSource
对于RTSP,有RtspMediaSource

DefaultMediaSourceFactory也能创建更加复杂的媒体源,
这依赖于相应的媒体项的属性。

对于需要媒体源的APP,播放器的默认配置不支持这个设置,有一些定制的方法。

定制媒体源的创建

当构建一个播放器时,一个MediaSource.Factory能被注入。例如,
如果一个APP需要加广告和使用一个CacheDataSource.Factory来支持
缓冲,DefaultMediaSourceFactory的实例能被配置来满足这些需求并且
在播放器的组装子中注入它:

Kotlin

  val mediaSourceFactory: MediaSource.Factory =
    DefaultMediaSourceFactory(context)
      .setDataSourceFactory(cacheDataSourceFactory)
      .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
  val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

注入一个定制的MediaSource.Factory的实现也是可能的。例如
为了支持创建一个定制的媒体源类型。工厂的createMediaSource(MediaItem)
能被调用来创建一个媒体源,再加入到播放列表中。

基于播放列表的API的媒体源

ExoPlayer的接口定义了附加的播放列表方法,来接受媒体源而不是媒体项。通过
把播放器的内部的MediaSource.Factory和媒体源的实例直接传给播放器,这是可行的:

Kotlin

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

高级的媒体源的组合

ExoPlayer提供了多个媒体源的实现,来改变和组合其它的媒体源实例。
如下的是最有用的,很多手定制的源是由它们进行组合的,没有更简单且有效的了

ClippingMediaSource: 允许剪切媒体到一个特定的时间范围。

FilteringMediaSource:过滤可用的轨道到特定的类型

MergingMediaSource: 合并多个媒体源来并行的播放。

ConcatenatingMediaSource2:合并多个媒体源来串行的播放。

SilenceMediaSource:生成静音的媒体源

AdsMediaSource:扩展一个媒体源加上客户端的加入广告功能。

ServerSideAdInsertionMediaSource:扩展一个媒体源加上服务器端的加入广告功能。


网站公告

今日签到

点亮在社区的每一天
去签到