From 2c5dd141f2531674272d5306b935fc0ebc84fe6e Mon Sep 17 00:00:00 2001 From: 21561 <215613905@qq.com> Date: Sat, 26 Apr 2025 19:18:38 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E8=BD=A8=E8=AE=B0=E5=BF=86;=20?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E5=99=A8=E5=A4=B1=E6=95=88;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../github/tvbox/osc/data/AppDataManager.java | 2 + .../github/tvbox/osc/player/ExoPlayer.java | 19 ++++--- .../tvbox/osc/player/IjkMediaPlayer.java | 24 +++++---- .../tvbox/osc/ui/activity/PlayActivity.java | 9 ++-- .../tvbox/osc/ui/fragment/PlayFragment.java | 9 ++-- .../tvbox/osc/util/AudioTrackMemory.java | 49 +++++++++++++++++++ gradle.properties | 2 +- 7 files changed, 86 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/github/tvbox/osc/util/AudioTrackMemory.java diff --git a/app/src/main/java/com/github/tvbox/osc/data/AppDataManager.java b/app/src/main/java/com/github/tvbox/osc/data/AppDataManager.java index a5a85486..8990a4f4 100644 --- a/app/src/main/java/com/github/tvbox/osc/data/AppDataManager.java +++ b/app/src/main/java/com/github/tvbox/osc/data/AppDataManager.java @@ -1,5 +1,6 @@ package com.github.tvbox.osc.data; +import android.annotation.SuppressLint; import android.database.Cursor; import android.database.sqlite.SQLiteException; @@ -53,6 +54,7 @@ public class AppDataManager { }; static final Migration MIGRATION_2_3 = new Migration(2, 3) { + @SuppressLint("Range") @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE IF NOT EXISTS `vodRecordTmp` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `vodId` TEXT, `updateTime` INTEGER NOT NULL, `sourceKey` TEXT, `data` BLOB, `dataJson` TEXT, `testMigration` INTEGER NOT NULL)"); diff --git a/app/src/main/java/com/github/tvbox/osc/player/ExoPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/ExoPlayer.java index 9748bf73..0fddd208 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/ExoPlayer.java +++ b/app/src/main/java/com/github/tvbox/osc/player/ExoPlayer.java @@ -3,6 +3,7 @@ package com.github.tvbox.osc.player; import android.content.Context; import android.util.Pair; +import com.github.tvbox.osc.util.AudioTrackMemory; import com.github.tvbox.osc.util.LOG; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.source.TrackGroup; @@ -19,8 +20,11 @@ import java.util.Map; public class ExoPlayer extends ExoMediaPlayer { + private static AudioTrackMemory memory; + public ExoPlayer(Context context) { super(context); + memory = AudioTrackMemory.getInstance(context); } // 3. 获取所有轨道信息 public TrackInfo getTrackInfo() { @@ -70,16 +74,12 @@ public class ExoPlayer extends ExoMediaPlayer { return data; } - - - /** 缓存:key=播放地址,value=已选的 {groupIndex, trackIndex} */ - private static final Map> mTrackOverrideCache = new HashMap<>(); /** * 设置当前播放的音轨 * @param groupIndex 音轨组的索引 * @param trackIndex 音轨在组内的索引 */ - public void setTrack(int groupIndex, int trackIndex) { + public void setTrack(int groupIndex, int trackIndex,String playKey) { try { MappingTrackSelector.MappedTrackInfo mappedInfo = trackSelector.getCurrentMappedTrackInfo(); if (mappedInfo == null) { @@ -103,18 +103,17 @@ public class ExoPlayer extends ExoMediaPlayer { trackSelector.setParameters(builder.build()); // 缓存到 map:下次同一路径播放时使用 - if (currentPlayPath != null) { - mTrackOverrideCache.put(currentPlayPath, Pair.create(groupIndex, trackIndex)); + if (!playKey.isEmpty()) { + memory.save(playKey,groupIndex,trackIndex); } } catch (Exception e) { LOG.i("echo-setTrack error: " + e.getMessage()); } } - //加载上一次选中的音轨 - public void loadDefaultTrack() { - Pair pair = mTrackOverrideCache.get(currentPlayPath); + public void loadDefaultTrack(String playKey) { + Pair pair = memory.exoLoad(playKey); if (pair == null) return; MappingTrackSelector.MappedTrackInfo mappedInfo = trackSelector.getCurrentMappedTrackInfo(); diff --git a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java index f38d39e5..61baed78 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java +++ b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java @@ -6,6 +6,7 @@ import android.text.TextUtils; import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.bean.IJKCode; import com.github.tvbox.osc.server.ControlManager; +import com.github.tvbox.osc.util.AudioTrackMemory; import com.github.tvbox.osc.util.FileUtils; import com.github.tvbox.osc.util.HawkConfig; import com.github.tvbox.osc.util.LOG; @@ -28,10 +29,12 @@ public class IjkMediaPlayer extends IjkPlayer { private IJKCode codec = null; protected String currentPlayPath; + private static AudioTrackMemory memory; public IjkMediaPlayer(Context context, IJKCode codec) { super(context); this.codec = codec; + memory = AudioTrackMemory.getInstance(context); } @Override @@ -222,15 +225,18 @@ public class IjkMediaPlayer extends IjkPlayer { .replace(" ", ""); } - /** 缓存:key=播放地址,value=已选的 {trackIndex} */ - private static final Map mTrackIndexCache = new HashMap<>(); public void setTrack(int trackIndex) { int audioSelected = mMediaPlayer.getSelectedTrack(ITrackInfo.MEDIA_TRACK_TYPE_AUDIO); int subtitleSelected = mMediaPlayer.getSelectedTrack(ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT); if (trackIndex!=audioSelected && trackIndex!=subtitleSelected){ - // 缓存到 map:下次同一路径播放时使用 - if (currentPlayPath != null) { - mTrackIndexCache.put(currentPlayPath, trackIndex); + mMediaPlayer.selectTrack(trackIndex); + } + } + public void setTrack(int trackIndex,String playKey) { + int audioSelected = mMediaPlayer.getSelectedTrack(ITrackInfo.MEDIA_TRACK_TYPE_AUDIO); + if (trackIndex!=audioSelected){ + if (!playKey.isEmpty()) { + memory.save(playKey, trackIndex); } mMediaPlayer.selectTrack(trackIndex); } @@ -240,15 +246,15 @@ public class IjkMediaPlayer extends IjkPlayer { mMediaPlayer.setOnTimedTextListener(listener); } - public void loadDefaultTrack(TrackInfo trackInfo) { - Integer trackIndex = mTrackIndexCache.get(currentPlayPath); - if (trackIndex == null) { + public void loadDefaultTrack(TrackInfo trackInfo,String playKey) { + Integer trackIndex = memory.ijkLoad(playKey); + if (trackIndex == -1) { if(trackInfo!=null && trackInfo.getAudio().size()>1){ int firsIndex=trackInfo.getAudio().get(0).index; setTrack(firsIndex); } return; }; - setTrack(trackIndex); + setTrack(trackIndex,playKey); } } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index fb984d4e..6ea25dc6 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -381,8 +381,8 @@ public class PlayActivity extends BaseActivity { } mediaPlayer.pause(); long progress = mediaPlayer.getCurrentPosition();//保存当前进度,ijk 切换轨道 会有快进几秒 - if (mediaPlayer instanceof IjkMediaPlayer)((IjkMediaPlayer)mediaPlayer).setTrack(value.index); - if (mediaPlayer instanceof ExoPlayer)((ExoPlayer)mediaPlayer).setTrack(value.groupIndex,value.index); + if (mediaPlayer instanceof IjkMediaPlayer)((IjkMediaPlayer)mediaPlayer).setTrack(value.index,progressKey); + if (mediaPlayer instanceof ExoPlayer)((ExoPlayer)mediaPlayer).setTrack(value.groupIndex,value.index,progressKey); new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -587,7 +587,7 @@ public class PlayActivity extends BaseActivity { mController.mSubtitleView.hasInternal = true; } //默认选中第一个音轨 一般第一个音轨是国语 && 加载上一次选中的 - ((IjkMediaPlayer)mVideoView.getMediaPlayer()).loadDefaultTrack(trackInfo); + ((IjkMediaPlayer)mVideoView.getMediaPlayer()).loadDefaultTrack(trackInfo,progressKey); ((IjkMediaPlayer)(mVideoView.getMediaPlayer())).setOnTimedTextListener(new IMediaPlayer.OnTimedTextListener() { @Override public void onTimedText(IMediaPlayer mp, IjkTimedText text) { @@ -602,7 +602,7 @@ public class PlayActivity extends BaseActivity { } if(mVideoView.getMediaPlayer() instanceof ExoPlayer){ //加载上一次选中的 - ((ExoPlayer) mVideoView.getMediaPlayer()).loadDefaultTrack(); + ((ExoPlayer) mVideoView.getMediaPlayer()).loadDefaultTrack(progressKey); } mController.mSubtitleView.bindToMediaPlayer(mVideoView.getMediaPlayer()); mController.mSubtitleView.setPlaySubtitleCacheKey(subtitleCacheKey); @@ -952,6 +952,7 @@ public class PlayActivity extends BaseActivity { stopParse(); initParseLoadFound(); + allowSwitchPlayer = true; mController.stopOther(); if(mVideoView!=null) mVideoView.release(); subtitleCacheKey = mVodInfo.sourceKey + "-" + mVodInfo.id + "-" + mVodInfo.playFlag + "-" + mVodInfo.playIndex+ "-" + vs.name + "-subt"; diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java index fe8fa343..59741411 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java @@ -399,8 +399,8 @@ public class PlayFragment extends BaseLazyFragment { } mediaPlayer.pause(); long progress = mediaPlayer.getCurrentPosition();//保存当前进度,ijk 切换轨道 会有快进几秒 - if (mediaPlayer instanceof IjkMediaPlayer)((IjkMediaPlayer)mediaPlayer).setTrack(value.index); - if (mediaPlayer instanceof ExoPlayer)((ExoPlayer)mediaPlayer).setTrack(value.groupIndex,value.index); + if (mediaPlayer instanceof IjkMediaPlayer)((IjkMediaPlayer)mediaPlayer).setTrack(value.index,progressKey); + if (mediaPlayer instanceof ExoPlayer)((ExoPlayer)mediaPlayer).setTrack(value.groupIndex,value.index,progressKey); new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -606,7 +606,7 @@ public class PlayFragment extends BaseLazyFragment { mController.mSubtitleView.hasInternal = true; } //默认选中第一个音轨 一般第一个音轨是国语 && 加载上一次选中的 - ((IjkMediaPlayer)mediaPlayer).loadDefaultTrack(trackInfo); + ((IjkMediaPlayer)mediaPlayer).loadDefaultTrack(trackInfo,progressKey); ((IjkMediaPlayer)mediaPlayer).setOnTimedTextListener(new IMediaPlayer.OnTimedTextListener() { @Override public void onTimedText(IMediaPlayer mp, IjkTimedText text) { @@ -621,7 +621,7 @@ public class PlayFragment extends BaseLazyFragment { } if(mediaPlayer instanceof ExoPlayer){ //加载上一次选中的 - ((ExoPlayer) mediaPlayer).loadDefaultTrack(); + ((ExoPlayer) mediaPlayer).loadDefaultTrack(progressKey); } mController.mSubtitleView.bindToMediaPlayer(mVideoView.getMediaPlayer()); mController.mSubtitleView.setPlaySubtitleCacheKey(subtitleCacheKey); @@ -997,6 +997,7 @@ public class PlayFragment extends BaseLazyFragment { stopParse(); initParseLoadFound(); + allowSwitchPlayer=true; mController.stopOther(); if(mVideoView!=null) mVideoView.release(); subtitleCacheKey = mVodInfo.sourceKey + "-" + mVodInfo.id + "-" + mVodInfo.playFlag + "-" + mVodInfo.playIndex+ "-" + vs.name + "-subt"; diff --git a/app/src/main/java/com/github/tvbox/osc/util/AudioTrackMemory.java b/app/src/main/java/com/github/tvbox/osc/util/AudioTrackMemory.java new file mode 100644 index 00000000..77d40ec5 --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/util/AudioTrackMemory.java @@ -0,0 +1,49 @@ +package com.github.tvbox.osc.util; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Pair; + +/** + * 音轨记忆 + */ +public class AudioTrackMemory { + private static AudioTrackMemory instance; + private static SharedPreferences prefs = null; + private static final String PREFS_NAME = "audio_track_prefs"; + private static final String KEY_GROUP_SUFFIX = "_group"; + private static final String KEY_TRACK_SUFFIX = "_track"; + + private AudioTrackMemory(Context context) { + prefs = context.getApplicationContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + } + public static synchronized AudioTrackMemory getInstance(Context context) { + if (instance == null) { + instance = new AudioTrackMemory(context); + } + return instance; + } + public void save(String playKey, int groupIndex, int trackIndex) { + LOG.i("echo-AudioTrackMemory save playKey:"+playKey); + prefs.edit().putInt(playKey +"_exo" + KEY_GROUP_SUFFIX, groupIndex).putInt(playKey + KEY_TRACK_SUFFIX, trackIndex).apply(); + } + public void save(String playKey, int trackIndex) { + LOG.i("echo-AudioTrackMemory save playKey:"+playKey); + prefs.edit().putInt(playKey +"_ijk" + KEY_TRACK_SUFFIX, trackIndex).apply(); + } + public Pair exoLoad(String playKey) { + playKey=playKey + "_exo"; + Pair p; + int group = prefs.getInt(playKey + KEY_GROUP_SUFFIX, -1); + int track = prefs.getInt(playKey + KEY_TRACK_SUFFIX, -1); + if (group >= 0 && track >= 0) { + p = Pair.create(group, track); + return p; + } + return null; + } + public Integer ijkLoad(String playKey) { + playKey=playKey + "_ijk"; + return prefs.getInt(playKey + KEY_TRACK_SUFFIX, -1); + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 306a3be4..848e153d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,4 @@ android.useAndroidX=true android.enableJetifier=true IsDebug=true #build on off -org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED \ No newline at end of file +#org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED \ No newline at end of file