2016-11-07 1 views
0

Ich habe mehrere Sprachen für Untertitel in separaten Dateien. Ich würde gerne Untertitel wechseln, wenn ich einen Film sehe. Was ist der richtige Weg, um die Untertitel mit addSubtitleSource() Methode in Android VideoView zu ändern?Wie Untertitel in VideoView geändert werden

if (subtitle.equals("Language_1")){ //button "Language_1" 
mVideoView.addSubtitleSource(source_1, MediaFormat.createSubtitleFormat("text/vtt", "en")); 
} 
if (subtitle.equals("Language2")){ //button "Language_2" 
mVideoView.addSubtitleSource(source_2, MediaFormat.createSubtitleFormat("text/vtt", "en")); 
} 

Wenn ich ein Video anhalten und starten, dann kann ich zwischen Untertitel mit diesem Code (wahrscheinlich, weil nach dem das Video neu zu starten „vergessen“ über hinzugefügt Unterquelle hat). Gibt es eine Möglichkeit, eine Untertitelquelle zu entladen und eine andere Untertitelquelle hinzuzufügen, ohne das Video neu zu laden? Ich denke an eine Methode wie removeSubtitleSource(), die nicht existiert.

EDIT: Vielleicht kann ich CaptioningManger dafür verwenden?

Antwort

0

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 ...