diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java index 0ac9e169e..282a9ac67 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java @@ -100,9 +100,9 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener private void addIjkTrack(List items) { int track = player.ijk().getSelectedTrack(type); - IjkTrackInfo[] trackInfos = player.ijk().getTrackInfo(); - for (int i = 0; i < trackInfos.length; i++) { - IjkTrackInfo trackInfo = trackInfos[i]; + List trackInfos = player.ijk().getTrackInfo(); + for (int i = 0; i < trackInfos.size(); i++) { + IjkTrackInfo trackInfo = trackInfos.get(i); if (trackInfo.getTrackType() != type) continue; Track item = new Track(type, provider.getTrackName(trackInfo)); item.setPlayer(player.getPlayer()); diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java index 5557ded6c..7b16f8262 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.util.Map; import tv.danmaku.ijk.media.player.misc.IMediaDataSource; -import tv.danmaku.ijk.media.player.misc.ITrackInfo; public interface IMediaPlayer { /* @@ -201,11 +200,6 @@ public interface IMediaPlayer { boolean isLooping(); - /*-------------------- - * AndroidMediaPlayer: JELLY_BEAN - */ - ITrackInfo[] getTrackInfo(); - /*-------------------- * AndroidMediaPlayer: ICE_CREAM_SANDWICH: */ diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java index a79beb88f..272760458 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java @@ -46,6 +46,7 @@ import java.lang.ref.WeakReference; import java.net.URLEncoder; import java.security.InvalidParameterException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; @@ -539,25 +540,18 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer { } } - @Override - public IjkTrackInfo[] getTrackInfo() { + private List getStreams() { Bundle bundle = getMediaMeta(); - if (bundle == null) return null; + if (bundle == null) return Collections.emptyList(); IjkMediaMeta mediaMeta = IjkMediaMeta.parse(bundle); - if (mediaMeta == null) return null; + if (mediaMeta == null) return Collections.emptyList(); + return mediaMeta.mStreams; + } + + public List getTrackInfo() { List trackInfos = new ArrayList<>(); - for (IjkMediaMeta.IjkStreamMeta streamMeta : mediaMeta.mStreams) { - IjkTrackInfo trackInfo = new IjkTrackInfo(streamMeta); - if (streamMeta.mType.equalsIgnoreCase(IjkMediaMeta.IJKM_VAL_TYPE__VIDEO)) { - trackInfo.setTrackType(ITrackInfo.MEDIA_TRACK_TYPE_VIDEO); - } else if (streamMeta.mType.equalsIgnoreCase(IjkMediaMeta.IJKM_VAL_TYPE__AUDIO)) { - trackInfo.setTrackType(ITrackInfo.MEDIA_TRACK_TYPE_AUDIO); - } else if (streamMeta.mType.equalsIgnoreCase(IjkMediaMeta.IJKM_VAL_TYPE__TIMEDTEXT)) { - trackInfo.setTrackType(ITrackInfo.MEDIA_TRACK_TYPE_TEXT); - } - trackInfos.add(trackInfo); - } - return trackInfos.toArray(new IjkTrackInfo[0]); + for (IjkMediaMeta.IjkStreamMeta streamMeta : getStreams()) trackInfos.add(new IjkTrackInfo(streamMeta)); + return trackInfos; } public int getSelectedTrack(int trackType) { diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/misc/IjkTrackInfo.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/misc/IjkTrackInfo.java index 249cc0a42..3bb7d5153 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/misc/IjkTrackInfo.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/misc/IjkTrackInfo.java @@ -19,19 +19,27 @@ package tv.danmaku.ijk.media.player.misc; import android.text.TextUtils; +import androidx.annotation.NonNull; + import tv.danmaku.ijk.media.player.IjkMediaMeta; public class IjkTrackInfo implements ITrackInfo { + private final IjkMediaMeta.IjkStreamMeta mStreamMeta; private int mTrackType = MEDIA_TRACK_TYPE_UNKNOWN; - private IjkMediaMeta.IjkStreamMeta mStreamMeta; public IjkTrackInfo(IjkMediaMeta.IjkStreamMeta streamMeta) { - mStreamMeta = streamMeta; + initTrackType(mStreamMeta = streamMeta); } - public void setMediaMeta(IjkMediaMeta.IjkStreamMeta streamMeta) { - mStreamMeta = streamMeta; + private void initTrackType(IjkMediaMeta.IjkStreamMeta streamMeta) { + if (streamMeta.mType.equalsIgnoreCase(IjkMediaMeta.IJKM_VAL_TYPE__VIDEO)) { + setTrackType(ITrackInfo.MEDIA_TRACK_TYPE_VIDEO); + } else if (streamMeta.mType.equalsIgnoreCase(IjkMediaMeta.IJKM_VAL_TYPE__AUDIO)) { + setTrackType(ITrackInfo.MEDIA_TRACK_TYPE_AUDIO); + } else if (streamMeta.mType.equalsIgnoreCase(IjkMediaMeta.IJKM_VAL_TYPE__TIMEDTEXT)) { + setTrackType(ITrackInfo.MEDIA_TRACK_TYPE_TEXT); + } } @Override @@ -64,6 +72,7 @@ public class IjkTrackInfo implements ITrackInfo { mTrackType = trackType; } + @NonNull @Override public String toString() { return getClass().getSimpleName() + '{' + getInfoInline() + "}"; diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index 8aea7a27e..0be50bf73 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -13,6 +13,7 @@ import android.widget.MediaController; import androidx.annotation.NonNull; +import java.util.List; import java.util.Map; import tv.danmaku.ijk.media.player.IMediaPlayer; @@ -457,14 +458,12 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl } public boolean haveTrack(int type) { - IjkTrackInfo[] trackInfos = mIjkPlayer.getTrackInfo(); - if (trackInfos == null) return false; int count = 0; - for (IjkTrackInfo trackInfo : trackInfos) if (trackInfo.getTrackType() == type) ++count; + for (IjkTrackInfo trackInfo : getTrackInfo()) if (trackInfo.getTrackType() == type) ++count; return count > 0; } - public IjkTrackInfo[] getTrackInfo() { + public List getTrackInfo() { return mIjkPlayer.getTrackInfo(); } @@ -474,28 +473,39 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl public void selectTrack(int type, int track) { int selected = getSelectedTrack(type); - if (selected == track) return; - long position = getCurrentPosition(); - mIjkPlayer.selectTrack(track); - mSubtitleView.setText(""); - if (position != 0) seekTo(position); + List trackInfos = getTrackInfo(); + for (int index = 0; index < trackInfos.size(); index++) { + IjkTrackInfo trackInfo = trackInfos.get(index); + if (trackInfo.getTrackType() != type) continue; + if (index == track && selected != track) { + long position = getCurrentPosition(); + mSubtitleView.setText(""); + mIjkPlayer.selectTrack(index); + if (position != 0) seekTo(position); + } + } } public void deselectTrack(int type, int track) { int selected = getSelectedTrack(type); - if (selected != track) return; - long position = getCurrentPosition(); - mIjkPlayer.deselectTrack(track); - mSubtitleView.setText(""); - if (position != 0) seekTo(position); + List trackInfos = getTrackInfo(); + for (int index = 0; index < trackInfos.size(); index++) { + IjkTrackInfo trackInfo = trackInfos.get(index); + if (trackInfo.getTrackType() != type) continue; + if (index == track && selected == track) { + long position = getCurrentPosition(); + mSubtitleView.setText(""); + mIjkPlayer.deselectTrack(track); + if (position != 0) seekTo(position); + } + } } private void setPreferredTextLanguage() { - IjkTrackInfo[] trackInfos = mIjkPlayer.getTrackInfo(); - if (trackInfos == null) return; + List trackInfos = getTrackInfo(); int selected = getSelectedTrack(ITrackInfo.MEDIA_TRACK_TYPE_TEXT); - for (int index = 0; index < trackInfos.length; index++) { - IjkTrackInfo trackInfo = trackInfos[index]; + for (int index = 0; index < trackInfos.size(); index++) { + IjkTrackInfo trackInfo = trackInfos.get(index); if (trackInfo.getTrackType() != ITrackInfo.MEDIA_TRACK_TYPE_TEXT) continue; if (trackInfo.getLanguage().equals("zh") && index != selected) { mIjkPlayer.selectTrack(index);