音轨记忆;

修正自动切换播放器失效;
main
21561 11 months ago
parent f36a9c7d5b
commit 2c5dd141f2
  1. 2
      app/src/main/java/com/github/tvbox/osc/data/AppDataManager.java
  2. 19
      app/src/main/java/com/github/tvbox/osc/player/ExoPlayer.java
  3. 24
      app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java
  4. 9
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  5. 9
      app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java
  6. 49
      app/src/main/java/com/github/tvbox/osc/util/AudioTrackMemory.java
  7. 2
      gradle.properties

@ -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)");

@ -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<String, Pair<Integer, Integer>> 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<Integer, Integer> pair = mTrackOverrideCache.get(currentPlayPath);
public void loadDefaultTrack(String playKey) {
Pair<Integer, Integer> pair = memory.exoLoad(playKey);
if (pair == null) return;
MappingTrackSelector.MappedTrackInfo mappedInfo = trackSelector.getCurrentMappedTrackInfo();

@ -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<String, Integer> 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);
}
}

@ -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";

@ -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";

@ -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<Integer,Integer> exoLoad(String playKey) {
playKey=playKey + "_exo";
Pair<Integer,Integer> 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);
}
}

@ -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
#org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED
Loading…
Cancel
Save