如何在Android Kotlin中的每个活动上显示播放视频的背景

时间:2019-07-13 14:24:56

标签: java android kotlin exoplayer exoplayer2.x

有什么办法可以显示正在后台播放的视频? 当我按回视频时,由于已评论了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)
        }
    }


}

0 个答案:

没有答案