Ich weiß, ist zu spät für Ihre Frage, aber vielleicht kann die Antwort anderen Menschen helfen ... Ich arbeitete gerade an dieser vor kurzem und brauchte die gleiche Funktion der Änderung der angezeigten Untertitel von VideView.
Fügen Sie zuerst die zwei Untertitel (source_1
und source_2
) hinzu, wenn Sie das VideoView initialisieren.
Dann können Sie innerhalb des onPrepared() - Listeners Ihres VideoView-Objekts die für das aktuell wiedergegebene Video verfügbaren Spuren durchlaufen und sie in einer auf Ihrer Karte deklarierten Map speichern Klasse:
die benötigte Bezug auf die Mediaplayer zu Ihrem Videoview angebracht ist, die Karte für die verfügbaren Untertitelspuren und die aktuell gewählte Untertitel sind private Teilnehmer, erklärt auf meinem Fragment, das eine, die die Videoview enthält:
private MediaPlayer mediaPlayer;
private HashMap<String, IndexedTrackInfo> availableSubtitleTracks = new HashMap();
private IndexedTrackInfo currentSubtitleTrack;
Inhalt von onPrepared Listener
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(JGA,"onPrepared");
loadingIndicator.setVisibility(View.GONE);
videoView.start();
controllerFragmentListener.notifyPlaying();
isPlaying=true;
if(mediaPlayer == null) {
mediaPlayer = mp;
}
MediaPlayer.TrackInfo[] tracks = mp.getTrackInfo();
Log.d(TAG, "onInfo: MediaPlayer.getTrackInfo()[" + tracks.length + "]");
MediaPlayer.TrackInfo track;
IndexedTrackInfo indexedTrackInfo = null;
for (int i = 0; i < tracks.length; i++) {
track = tracks[i];
Log.d(TAG, "onInfo: track [email protected]" + i + ": " + track.getTrackType() + " = " + track.toString());
if (track.getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
indexedTrackInfo = new IndexedTrackInfo(track, i);
if(track.getFormat().containsKey(TRACK_SUBTITLE_IS_DEFAULT_KEY)) {
Log.d(TAG, "onInfo: Subtitle track has '" + TRACK_SUBTITLE_IS_DEFAULT_KEY + "' with value = " + track.getFormat().getInteger(TRACK_SUBTITLE_IS_DEFAULT_KEY));
if(track.getFormat().getInteger(TRACK_SUBTITLE_IS_DEFAULT_KEY) == 1) {
Log.d(TAG, "onInfo: This track set as default");
currentSubtitleTrack = indexedTrackInfo;
}
}
availableSubtitleTracks.put(track.getLanguage(), indexedTrackInfo);
}
}
if(currentSubtitleTrack == null && indexedTrackInfo != null) {
currentSubtitleTrack = indexedTrackInfo;
mediaPlayer.selectTrack(currentSubtitleTrack.getIndex());
Log.d(TAG, "onInfo: There was no default sub track but there are tracks available... picking the last one as default [" + currentSubtitleTrack.getIndex() + "]");
}
controllerFragmentListener.updateSpinnerSubtitleTracks(availableSubtitleTracks);
controllerFragmentListener.updateSpinnerCurrentSelection(currentSubtitleTrack.getTrackInfo().getLanguage());
}
Und der Brauch POJO jede Spur mit dem entsprechenden Index in dem track des Mediaplayer asociate (IndexedTrackInfo.java
):
public class IndexedTrackInfo {
private MediaPlayer.TrackInfo trackInfo;
private int index;
public IndexedTrackInfo(MediaPlayer.TrackInfo trackInfo, int index) {
this.trackInfo = trackInfo;
this.index = index;
}
public MediaPlayer.TrackInfo getTrackInfo() {
return trackInfo;
}
public int getIndex() {
return index;
}
}
Am Ende, was ich tat, war ein Spinner
mit dem zum Anzeigen Untertitel für den Benutzer und ändern Sie sie entsprechend ihrer "index"
.
Das hängt von Ihren Bedürfnissen, aber für die Ansicht/hidding/die aktuelle Untertitelspur zu ändern, was Sie tun müssen, ist so etwas wie:
//To show the subtitles:
mediaPlayer.selectTrack(currentSubtitleTrack.getIndex());
//To hide the subtitles:
mediaPlayer.deselectTrack(currentSubtitleTrack.getIndex());
//To change the track (secondSourceSubtitleTrack is the object in the map corresponding to your other subtitle source):
currentSubtitleTrack = secondSourceSubtitleTrack;
mediaPlayer.selectTrack(currentSubtitleTrack.getIndex());
Ich hoffe, das jemand anderes helfen kann ... Ich war damit lange zu quälen ... da scheint es noch nicht viel Dokumentation oder Beispiele zu geben ...