Optimize ijk track

pull/123/head
FongMi 3 years ago
parent fddac7c30f
commit 06fbd4a4f5
  1. 6
      app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java
  2. 6
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java
  3. 26
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java
  4. 17
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/misc/IjkTrackInfo.java
  5. 46
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java

@ -100,9 +100,9 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener
private void addIjkTrack(List<Track> 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<IjkTrackInfo> 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());

@ -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:
*/

@ -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<IjkMediaMeta.IjkStreamMeta> 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<IjkTrackInfo> getTrackInfo() {
List<IjkTrackInfo> 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) {

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

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

Loading…
Cancel
Save