Skip to content

Commit 7db2ca3

Browse files
committed
fix video player
1 parent b5b033b commit 7db2ca3

3 files changed

Lines changed: 63 additions & 68 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ android {
1717
applicationId = "com.donut.mixfile"
1818
minSdk = 26
1919
targetSdk = 36
20-
versionCode = 160
21-
versionName = "2.0.11.1"
20+
versionCode = 161
21+
versionName = "2.0.11.2"
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2424
vectorDrawables {

app/src/main/java/com/donut/mixfile/activity/video/player/BottomControl.kt

Lines changed: 50 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Column
1010
import androidx.compose.foundation.layout.Row
1111
import androidx.compose.foundation.layout.fillMaxWidth
1212
import androidx.compose.foundation.layout.padding
13+
import androidx.compose.foundation.layout.size
1314
import androidx.compose.material.icons.Icons
1415
import androidx.compose.material.icons.filled.SkipNext
1516
import androidx.compose.material.icons.filled.SkipPrevious
@@ -20,11 +21,11 @@ import androidx.compose.runtime.Composable
2021
import androidx.compose.runtime.remember
2122
import androidx.compose.ui.Alignment
2223
import androidx.compose.ui.Modifier
24+
import androidx.compose.ui.draw.scale
2325
import androidx.compose.ui.graphics.Color
2426
import androidx.compose.ui.unit.dp
2527
import androidx.compose.ui.unit.sp
2628
import androidx.media3.common.C
27-
import androidx.media3.common.TrackSelectionOverride
2829
import androidx.media3.exoplayer.ExoPlayer
2930
import com.donut.mixfile.ui.component.common.MixDialogBuilder
3031
import com.donut.mixfile.ui.component.common.SingleSelectItemList
@@ -73,12 +74,41 @@ fun BottomControl(
7374
verticalAlignment = Alignment.CenterVertically,
7475
horizontalArrangement = Arrangement.spacedBy(15.dp)
7576
) {
77+
var lastSeek = remember { System.currentTimeMillis() }
7678
if (player.mediaItemCount > 1) {
77-
IconButton(onClick = { player.seekToPreviousMediaItem() }) {
78-
Icon(Icons.Default.SkipPrevious, "Previous", tint = Color.White)
79+
IconButton(
80+
modifier = Modifier.scale(1f),
81+
onClick = {
82+
if (System.currentTimeMillis() - lastSeek < 500) {
83+
return@IconButton
84+
}
85+
lastSeek = System.currentTimeMillis()
86+
player.seekToPreviousMediaItem()
87+
},
88+
) {
89+
Icon(
90+
modifier = Modifier.size(100.dp),
91+
imageVector = Icons.Default.SkipPrevious,
92+
contentDescription = "Previous",
93+
tint = Color.White
94+
)
7995
}
80-
IconButton(onClick = { player.seekToNextMediaItem() }) {
81-
Icon(Icons.Default.SkipNext, "Next", tint = Color.White)
96+
IconButton(
97+
modifier = Modifier.scale(1f),
98+
onClick = {
99+
if (System.currentTimeMillis() - lastSeek < 500) {
100+
return@IconButton
101+
}
102+
lastSeek = System.currentTimeMillis()
103+
player.seekToNextMediaItem()
104+
},
105+
) {
106+
Icon(
107+
modifier = Modifier.size(100.dp),
108+
imageVector = Icons.Default.SkipNext,
109+
contentDescription = "Next",
110+
tint = Color.White
111+
)
82112
}
83113
}
84114
Text(
@@ -103,71 +133,30 @@ fun BottomControl(
103133
remember(tracks) { tracks.groups.filter { it.type == C.TRACK_TYPE_AUDIO } }
104134
if (audioGroups.size > 1) {
105135
PlayerSettingChip("音轨") {
106-
val infos = TrackUtils.getFormattedTracks(audioGroups, "音轨")
107-
val options = infos.map { it.label }
108-
val current =
109-
infos.find { it.isSelected }?.label ?: options.firstOrNull() ?: ""
110-
111-
MixDialogBuilder("选择音轨", colorScheme = playerColorScheme).apply {
112-
setContent {
113-
SingleSelectItemList(
114-
options,
115-
currentOption = current
116-
) { selected ->
117-
val target = infos.find { it.label == selected }!!
118-
player.trackSelectionParameters =
119-
player.trackSelectionParameters
120-
.buildUpon()
121-
.setOverrideForType(
122-
TrackSelectionOverride(
123-
target.group,
124-
target.index
125-
)
126-
)
127-
.build()
128-
closeDialog()
129-
}
130-
}
131-
show()
132-
}
136+
showTrackSelector(
137+
title = "选择音轨",
138+
player = player,
139+
trackType = C.TRACK_TYPE_AUDIO,
140+
colorScheme = playerColorScheme,
141+
hasDisableOption = false
142+
)
133143
}
134144
}
135145

136146
// 字幕选择
137147
val textGroups = remember(tracks) {
138148
tracks.groups.filter { it.type == C.TRACK_TYPE_TEXT }
139149
}
150+
140151
if (textGroups.isNotEmpty()) {
141152
PlayerSettingChip("字幕") {
142-
val infos = TrackUtils.getFormattedTracks(textGroups, "字幕")
143-
val options = listOf("关闭") + infos.map { it.label }
144-
val current = infos.find { it.isSelected }?.label ?: "关闭"
145-
146-
MixDialogBuilder("选择字幕", colorScheme = playerColorScheme).apply {
147-
setContent {
148-
SingleSelectItemList(
149-
options,
150-
currentOption = current
151-
) { selected ->
152-
val builder = player.trackSelectionParameters.buildUpon()
153-
if (selected == "关闭") {
154-
builder.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true)
155-
} else {
156-
val target = infos.find { it.label == selected }!!
157-
builder.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false)
158-
.setOverrideForType(
159-
TrackSelectionOverride(
160-
target.group,
161-
target.index
162-
)
163-
)
164-
}
165-
player.trackSelectionParameters = builder.build()
166-
closeDialog()
167-
}
168-
}
169-
show()
170-
}
153+
showTrackSelector(
154+
title = "选择字幕",
155+
player = player,
156+
trackType = C.TRACK_TYPE_TEXT,
157+
colorScheme = playerColorScheme,
158+
hasDisableOption = true
159+
)
171160
}
172161
}
173162

app/src/main/java/com/donut/mixfile/activity/video/player/PlayerUtils.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,22 @@ fun showTrackSelector(
7777
colorScheme: ColorScheme,
7878
hasDisableOption: Boolean = false
7979
) {
80+
// 只保留指定类型的 track group
8081
val groups = player.currentTracks.groups.filter { it.type == trackType }
8182
val trackInfos = TrackUtils.getFormattedTracks(
8283
groups,
8384
if (trackType == C.TRACK_TYPE_TEXT) "字幕" else "音轨"
8485
)
8586

86-
val options =
87-
if (hasDisableOption) listOf("关闭") + trackInfos.map { it.label } else trackInfos.map { it.label }
88-
val currentLabel =
89-
trackInfos.find { it.isSelected }?.label ?: if (hasDisableOption) "关闭" else ""
87+
// 构建选项列表
88+
val options = buildList {
89+
if (hasDisableOption) add("关闭")
90+
addAll(trackInfos.map { it.label })
91+
}
92+
93+
// 获取当前选中的 label
94+
val currentLabel = trackInfos.firstOrNull { it.isSelected }?.label
95+
?: if (hasDisableOption) "关闭" else options.firstOrNull().orEmpty()
9096

9197
MixDialogBuilder(title, colorScheme = colorScheme).apply {
9298
setContent {
@@ -95,7 +101,7 @@ fun showTrackSelector(
95101
if (selected == "关闭") {
96102
builder.setTrackTypeDisabled(trackType, true)
97103
} else {
98-
val info = trackInfos.find { it.label == selected }!!
104+
val info = trackInfos.first { it.label == selected }
99105
builder.setTrackTypeDisabled(trackType, false)
100106
.setOverrideForType(TrackSelectionOverride(info.group, info.index))
101107
}

0 commit comments

Comments
 (0)