有什么办法可以显示正在后台播放的视频? 当我按回视频时,由于已评论了releaseExoPlayer()方法,因此进入背景。
// releaseExoplayer()
// super.onStop()
//
// }
正常情况下,活动停止后,我们会释放Player,但就我而言,我想显示与其他屏幕上播放的视频相同的视频。
我正在使用Kotlin最新版本和exoplayer.2
请帮助我在其他片段/活动屏幕上显示背景视频。
package com.example.project.resources
import android.app.PictureInPictureParams
import android.content.res.Configuration
import android.graphics.Rect
import android.net.Uri
import android.os.Bundle
import android.os.Parcel
import android.os.Parcelable
import android.util.Rational
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity;
import com.example.project.R
import com.google.android.exoplayer2.*
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.source.TrackGroupArray
import com.google.android.exoplayer2.source.dash.DashMediaSource
import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.trackselection.TrackSelectionArray
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
import kotlinx.android.synthetic.main.activity_video_player.*
import com.google.android.exoplayer2.source.ExtractorMediaSource
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
import com.google.android.exoplayer2.extractor.ExtractorsFactory
import com.google.android.exoplayer2.util.Util
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener
import com.google.android.exoplayer2.source.hls.DefaultHlsDataSourceFactory
import com.google.android.exoplayer2.source.hls.HlsMediaSource
import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource
import com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource
import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource
class VideoDetail() : AppCompatActivity(), Player.EventListener {
private val mPictureInPictureParamsBuilder = PictureInPictureParams.Builder()
private lateinit var simpleExoPlayer: SimpleExoPlayer
private var playbackPosition = 0L
private val dashUrl = "http://ott-cdn.ucom.am/s27/index.m3u8?fluxustv.m3u8"
private val bandWidthMeter by lazy {
DefaultBandwidthMeter()
}
private val adapterTrackSelectionFactory by lazy {
AdaptiveTrackSelection.Factory(bandWidthMeter)
}
var extractorsFactory: ExtractorsFactory = DefaultExtractorsFactory()
override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {
}
override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {
}
override fun onPlayerError(error: ExoPlaybackException?) {
}
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_BUFFERING){
progressBar.visibility =View.VISIBLE
}
else if(playbackState == Player.STATE_READY){
progressBar.visibility = View.INVISIBLE
}
}
override fun onLoadingChanged(isLoading: Boolean) {
}
override fun onPositionDiscontinuity() {
}
override fun onRepeatModeChanged(repeatMode: Int) {
}
override fun onTimelineChanged(timeline: Timeline?, manifest: Any?) {
}
constructor(parcel: Parcel) : this() {
playbackPosition = parcel.readLong()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_player)
}
override fun onStart() {
super.onStart()
initializeExoplayer()
}
override fun onRestart() {
super.onRestart()
initializeExoplayer()
}
// override fun onStop() {
// releaseExoplayer()
// super.onStop()
//
// }
private fun initializeExoplayer(){
simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(
DefaultRenderersFactory(this),
DefaultTrackSelector(adapterTrackSelectionFactory),
DefaultLoadControl()
)
prepareExoplayer()
simpleExoPlayerView.player = simpleExoPlayer
simpleExoPlayer.seekTo(playbackPosition)
simpleExoPlayer.playWhenReady = true
simpleExoPlayer.addListener(this)
}
private fun releaseExoplayer(){
playbackPosition = simpleExoPlayer.currentPosition
simpleExoPlayer.release()
}
private fun buildMediaSource(uri: Uri): MediaSource{
val dataSourceFactory = DefaultHttpDataSourceFactory("UA",bandWidthMeter)
@C.ContentType val type = Util.inferContentType(uri)
when (type) {
C.TYPE_DASH ->{
val dashChunkSourceFactory = DefaultDashChunkSource.Factory(dataSourceFactory)
return DashMediaSource(uri, dataSourceFactory, dashChunkSourceFactory, null, null)
}
C.TYPE_SS ->{
val ssChukData = DefaultSsChunkSource.Factory(dataSourceFactory)
return SsMediaSource(uri, dataSourceFactory, ssChukData, null, null )
}
C.TYPE_HLS ->{
val hlsdataSource = DefaultHlsDataSourceFactory(dataSourceFactory)
return HlsMediaSource(uri, hlsdataSource, 1, null, null)
}
C.TYPE_OTHER ->{
return ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null)
}
else -> {
throw IllegalStateException("Unsupported type: " + type);
}
}
}
private fun prepareExoplayer(){
val uri = Uri.parse(dashUrl)
val mediaSource = buildMediaSource(uri)
simpleExoPlayer.prepare(mediaSource)
}
companion object CREATOR : Parcelable.Creator<VideoDetail> {
override fun createFromParcel(parcel: Parcel): VideoDetail {
return VideoDetail(parcel)
}
override fun newArray(size: Int): Array<VideoDetail?> {
return arrayOfNulls(size)
}
}
}