ExoPlayer version: 2.7.3
语言: Kotlin
使用
STEP 0.布局文件中引入PlayerView
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/pv_player_view"
android:layout_width="match_parent"
android:layout_height="300dp"
app:resize_mode="fixed_width"
app:surface_type="surface_view"
app:use_controller="false"/>
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
- 其他格式参考:<b>https://google.github.io/ExoPlayer/faqs.html#why-do-some-streams-fail-with-unrecognizedinputformatexception</b>
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