Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: multi-track. #1

Open
wants to merge 8 commits into
base: release-qingmei2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
添加多播放器示例demo.
  • Loading branch information
qingmei2 committed Jun 27, 2022
commit a7e08d5a667a99054c485b28134667e397a1079b
3 changes: 2 additions & 1 deletion demos/multi-track/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ExoPlayer">
<activity
Expand All @@ -18,6 +17,8 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".MultiPlayerActivity" />
</application>

</manifest>
Binary file not shown.
Binary file not shown.
Binary file added demos/multi-track/src/main/assets/media/sunny.mp4
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@ package com.github.qingmei2.exoplayer.multi_track

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

findViewById<View>(R.id.btn_multi_player).setOnClickListener(this::onMultiPlayerClicked)
}

private fun onMultiPlayerClicked(view: View) {
MultiPlayerActivity.launch(this)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package com.github.qingmei2.exoplayer.multi_track

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import com.github.qingmei2.exoplayer.multi_track.utils.DemoDataSources
import com.google.android.exoplayer2.DefaultRenderersFactory
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.ui.StyledPlayerView
import java.util.*

class MultiPlayerActivity : AppCompatActivity() {

companion object Launcher {

fun launch(context: Context) {
val intent = Intent(context, MultiPlayerActivity::class.java)
context.startActivity(intent)
}
}

private lateinit var mBtnPlayTrack1: View
private lateinit var mBtnPlayTrack2: View

private lateinit var mSeekBar1: SeekBar
private lateinit var mSeekBar2: SeekBar

private lateinit var mExoPlayer1: ExoPlayer
private lateinit var mExoPlayer2: ExoPlayer

private lateinit var mExoVideoView: StyledPlayerView
private lateinit var mExoVideoPlayer: ExoPlayer

private var mTimer: Timer? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_multi_player)

mBtnPlayTrack1 = findViewById(R.id.btn_play_track1)
mBtnPlayTrack2 = findViewById(R.id.btn_play_track2)

mSeekBar1 = findViewById(R.id.seek_bar_01)
mSeekBar2 = findViewById(R.id.seek_bar_02)

mExoVideoView = findViewById(R.id.player_view)

initVideoPlayer()
initAudioPlayer()
initSeekbars()
}

private fun initVideoPlayer() {
mExoVideoPlayer = SimpleExoPlayer.Builder(this).build()
.apply {
mExoVideoView.player = this
addMediaItem(DemoDataSources.Assets.SUNNY_MP4)
prepare()
}
}

private fun initAudioPlayer() {
mExoPlayer1 = SimpleExoPlayer.Builder(this, DefaultRenderersFactory(this)).build()
.apply {
addMediaItem(DemoDataSources.Assets.SUMMER_MP3)
prepare()
}

mExoPlayer2 = SimpleExoPlayer.Builder(this, DefaultRenderersFactory(this)).build()
.apply {
addMediaItem(DemoDataSources.Assets.HALF_MOON_MP3)
prepare()
}

mBtnPlayTrack1.setOnClickListener {
if (mExoPlayer1.isPlaying) {
mExoPlayer1.pause()
} else {
mExoPlayer1.play()
}
}

mBtnPlayTrack2.setOnClickListener {
if (mExoPlayer2.isPlaying) {
mExoPlayer2.pause()
} else {
mExoPlayer2.play()
}
}
}

private fun initSeekbars() {
mSeekBar1.setOnSeekBarChangeListener(SimpleSeekBarListener(mExoPlayer1))
mSeekBar2.setOnSeekBarChangeListener(SimpleSeekBarListener(mExoPlayer2))
}

private fun startTimer() {
stopTimer()
mTimer = Timer().apply {
scheduleAtFixedRate(object : TimerTask() {
override fun run() {
mSeekBar1.post {
val durationSec = mExoPlayer1.duration / 1000L
val curDurationSec = mExoPlayer1.currentPosition / 1000L
mSeekBar1.max = durationSec.toInt()
mSeekBar1.progress = curDurationSec.toInt()
}

mSeekBar2.post {
val durationSec1 = mExoPlayer2.duration / 1000L
val curDurationSec1 = mExoPlayer2.currentPosition / 1000L
mSeekBar2.max = durationSec1.toInt()
mSeekBar2.progress = curDurationSec1.toInt()
}
}
}, 1000L, 1000L)
}
}

private fun stopTimer() {
mTimer?.apply {
cancel()
purge()
}
mTimer = null
}

override fun onResume() {
super.onResume()
startTimer()
}

override fun onPause() {
super.onPause()
stopTimer()
}

override fun onDestroy() {
super.onDestroy()
mExoPlayer1.stop()
mExoPlayer1.release()
mExoPlayer2.stop()
mExoPlayer2.release()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.github.qingmei2.exoplayer.multi_track

import android.widget.SeekBar
import androidx.annotation.RestrictTo
import com.google.android.exoplayer2.Player

@RestrictTo(RestrictTo.Scope.LIBRARY)
class SimpleSeekBarListener(private val player: Player) : SeekBar.OnSeekBarChangeListener {

override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (progress == 0 || seekBar.max == 0) return;
if (fromUser) {
player.seekTo(progress * 1000L);
}
}

override fun onStartTrackingTouch(seekBar: SeekBar) {
}

override fun onStopTrackingTouch(seekBar: SeekBar) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.github.qingmei2.exoplayer.multi_track.utils

import android.net.Uri
import com.google.android.exoplayer2.MediaItem

object DemoDataSources {

object Assets {

private const val SUMMER_MP3_URL = "asset:https:///media/summer.mp3"
private const val HALF_MOON_MP3_URL = "asset:https:///media/half_moon.mp3"

private const val SUNNY_MP4_URL = "asset:https:///media/sunny.mp4"

// 菊次郎的夏天.mp3
val SUMMER_MP3: MediaItem
get() = MediaItem.fromUri(Uri.parse(SUMMER_MP3_URL))

// 月半小夜曲.mp3
val HALF_MOON_MP3: MediaItem
get() = MediaItem.fromUri(Uri.parse(HALF_MOON_MP3_URL))

// 晴天.mp4
val SUNNY_MP4: MediaItem
get() = MediaItem.fromUri(Uri.parse(SUNNY_MP4_URL))
}
}

This file was deleted.

Loading