ExoPlayer初探

ExoPlayer version: 2.7.3
语言: Kotlin

使用

STEP 0.布局文件中引入PlayerView


STEP 1.创建默认selector和renderer

// selector
val BANDWIDTH_METER = DefaultBandwidthMeter()
val adaptiveTrackSelectionFactory = AdaptiveTrackSelection.Factory(BANDWIDTH_METER)
val trackerSelector = DefaultTrackSelector(adaptiveTrackSelectionFactory)

// renderer
val rendererFactory = DefaultRenderersFactory(this, null, 0)

STEP 2.通过selector和renderer创建播放器player

val rendererFactory = DefaultRenderersFactory(this, null, 0)
val player = ExoPlayerFactory.newSimpleInstance(rendererFactory, trackerSelector)
player.addListener(PlayerEventListener()) // Player本地定义,继承Player.DefaultEventListener(): private inner class PlayerEventListener : Player.DefaultEventListener()

STEP 3.关联playerView和player

playerView = findViewById(R.id.player_view)
player.playWhenReady = true
playerView.player = player

STEP 4.创建DataSource,指定播放Uri,播放视频

val userAgent = Util.getUserAgent(mContext, "DQPlayer")
val defaultHttpDataSourceFactory = DefaultHttpDataSourceFactory(userAgent, listener)
val mediaDataSourceFactory = DefaultDataSourceFactory(mContext, listener, defaultHttpDataSourceFactory)
val mediaSource = HlsMediaSource.Factory(mediaDataSourceFactory).createMediaSource(Uri.parse(VIDEO_URL), mainHandler, eventLogger)
player.prepare(mediaSource)

DataSource

  • DataSource的创建需要对应媒体文件的格式
  • 步骤4中的VIDEO_URL是我随便找的在线资源,由于是M3U8格式,所以对应HlsMediaSource
  • 其他格式参考:https://google.github.io/ExoPlayer/faqs.html#why-do-some-streams-fail-with-unrecognizedinputformatexception
DASH (mpd)
HLS (m3u8) 
SmoothStreaming (ism, isml)

缩放策略resize_mode

传统的MediaPlayer+SurfaceView或TextureView,如果想要实现播放器View的缩放,需要我们自己实现。在ExoPlayer中,我们只需要在布局文件中设置resize_mode即可

  • fit (默认) 自适应,减少或增加宽度或高度,取决于视频本身的款高比,同ImageView的centerInside
  • fixed_width 宽度是固定,通过减少或者增加高度的值来实现想要的宽高比。
  • fixed_height 高度固定,通过减少或者增加宽度的值来实现想要的宽高比。
  • fill 表示不考虑指定的宽高比。
  • zoom 表示通过增加宽度或者高度,来达到想要的视频宽高比。
    注意:所有缩放策略都是在playerView指定宽高下对内部View-contentFrame(AspectRatioFrameLayout)的缩放,而不是对playerView的缩放

surface_type

可以指定播放器View使用TextureView还是SurfaceView

  • texture_view
  • surface_view

你可能感兴趣的:(ExoPlayer初探)