Skip to content

Instantly share code, notes, and snippets.

@fatihkurcenli
Created February 11, 2022 14:25
Show Gist options
  • Save fatihkurcenli/f3b23f60a92dfd8ab2aba9b36ef5cfa8 to your computer and use it in GitHub Desktop.
Save fatihkurcenli/f3b23f60a92dfd8ab2aba9b36ef5cfa8 to your computer and use it in GitHub Desktop.
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var exoPlayer: SimpleExoPlayer
private lateinit var dataSourceFactory: DataSource.Factory
private lateinit var trackSelector: DefaultTrackSelector
private lateinit var playerView: PlayerView
private lateinit var exoQuality: ImageButton
private var currentWindow = 0
private var playbackPosition: Long = 0
private var isFullscreen = false
private var isPlayerPlaying = true
private var trackDialog: Dialog? = null
private val mediaItem = MediaItem.Builder()
.setUri(HLS_STATIC_URL)
.setMimeType(MimeTypes.APPLICATION_M3U8)
.build()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
playerView = findViewById(R.id.player_view)
exoQuality = playerView.findViewById(R.id.exo_quality)
dataSourceFactory = DefaultDataSourceFactory(
this,
Util.getUserAgent(this, "VideoQualityApp")
)
exoQuality.setOnClickListener {
if (trackDialog == null) {
initPopupQuality()
}
trackDialog?.show()
}
if (savedInstanceState != null) {
currentWindow = savedInstanceState.getInt(STATE_RESUME_WINDOW)
playbackPosition = savedInstanceState.getLong(STATE_RESUME_POSITION)
isFullscreen = savedInstanceState.getBoolean(STATE_PLAYER_FULLSCREEN)
isPlayerPlaying = savedInstanceState.getBoolean(STATE_PLAYER_PLAYING)
}
}
private fun initPlayer() {
trackSelector = DefaultTrackSelector(this)
trackSelector.setParameters(
trackSelector.buildUponParameters().setMaxVideoSize(MAX_WIDTH, MAX_HEIGHT)
)
exoPlayer = SimpleExoPlayer.Builder(this).setTrackSelector(trackSelector).build().apply {
playWhenReady = isPlayerPlaying
seekTo(currentWindow, playbackPosition)
setMediaItem(mediaItem)
prepare()
}
playerView.player = exoPlayer
exoPlayer.addListener(object : Player.Listener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_READY) {
exoQuality.visibility = View.VISIBLE
}
}
})
}
private fun releasePlayer() {
isPlayerPlaying = exoPlayer.playWhenReady
playbackPosition = exoPlayer.currentPosition
currentWindow = exoPlayer.currentWindowIndex
exoPlayer.release()
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putInt(STATE_RESUME_WINDOW, exoPlayer.currentWindowIndex)
outState.putLong(STATE_RESUME_POSITION, exoPlayer.currentPosition)
outState.putBoolean(STATE_PLAYER_FULLSCREEN, isFullscreen)
outState.putBoolean(STATE_PLAYER_PLAYING, isPlayerPlaying)
super.onSaveInstanceState(outState)
}
override fun onStart() {
super.onStart()
if (Util.SDK_INT > 23) {
initPlayer()
playerView.onResume()
}
}
override fun onResume() {
super.onResume()
if (Util.SDK_INT <= 23) {
initPlayer()
playerView.onResume()
}
}
override fun onPause() {
super.onPause()
if (Util.SDK_INT <= 23) {
playerView.onPause()
releasePlayer()
}
}
override fun onStop() {
super.onStop()
if (Util.SDK_INT > 23) {
playerView.onPause()
releasePlayer()
}
}
private fun initPopupQuality() {
val mappedTrackInfo = trackSelector.currentMappedTrackInfo
var videoRenderer: Int? = null
if (mappedTrackInfo == null) return else exoQuality.visibility = View.VISIBLE
for (i in 0 until mappedTrackInfo.rendererCount) {
if (isVideoRenderer(mappedTrackInfo, i)) {
videoRenderer = i
}
}
if (videoRenderer == null) {
exoQuality.visibility = View.GONE
return
}
val trackSelectionDialogBuilder = TrackSelectionDialogBuilder(
this,
getString(R.string.qualitySelector),
trackSelector,
videoRenderer
)
trackSelectionDialogBuilder.setTrackNameProvider {
getString(R.string.exo_track_resolution_pixel, it.height)
}
trackDialog = trackSelectionDialogBuilder.build()
}
private fun isVideoRenderer(
mappedTrackInfo: MappingTrackSelector.MappedTrackInfo,
rendererIndex: Int
): Boolean {
val trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex)
if (trackGroupArray.length == 0) {
return false
}
val trackType = mappedTrackInfo.getRendererType(rendererIndex)
return C.TRACK_TYPE_VIDEO == trackType
}
companion object {
private const val STATE_RESUME_WINDOW = "resumeWindow"
private const val STATE_RESUME_POSITION = "resumePosition"
private const val STATE_PLAYER_FULLSCREEN = "playerFullscreen"
private const val STATE_PLAYER_PLAYING = "playerOnPlay"
private const val MAX_HEIGHT = 1920
private const val MAX_WIDTH = 1080
private const val IP_CONFIG = "" //Your Ipv4 address
private const val HLS_STATIC_URL = "http://$IP_CONFIG:80/hls-server/input/master.m3u8"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment