2016-11-07 11 views
0

字幕用に複数の言語が別々のファイルにあります。映画を見るときに字幕を変更したいと思います。アンドロイドVideoViewのaddSubtitleSource()メソッドを使用して字幕を変更する正しい方法は何ですか?VideoViewで字幕を変更するには

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

私は停止し、ビデオを開始した場合、私はこのコードで字幕を切り替えることができます(おそらく、それは追加のサブソースについては「忘れられた」た映像を再起動した後)。 1つのサブタイトルソースをアンロードし、ビデオをリロードせずに異なるサブタイトルソースを追加する方法はありますか?私は存在しないremoveSubtitleSource()のようなメソッドを考えています。

EDIT:おそらく私はこれにCaptioningMangerを使用できますか?

答えて

0

あなたの質問は遅いと知っていますが、答えが他の人に役立つかもしれません... 私はちょうどこれを取り組んでいましたが、VideViewの表示字幕を変更するのと同じ機能が必要でした。

最初に、VideoViewを初期化するときに2つの字幕(source_1source_2)を追加します。

次に、VideoViewオブジェクトのonPrepared()リスナーの中で、現在再生中のビデオで使用できるトラックを反復処理して、自分の上に宣言されたマップに保存しますクラス:

private MediaPlayer mediaPlayer; 
private HashMap<String, IndexedTrackInfo> availableSubtitleTracks = new HashMap(); 
private IndexedTrackInfo currentSubtitleTrack; 

あなたvideoViewに添付MediaPlayerのに必要な参照、利用できる字幕トラック用のマップと現在選択されている字幕トラックがあるプライベートクラスのメンバーは、私のフラグメントにVideoViewが含まれているものを宣言しました

オンの準備リスナーのコンテンツ

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

とMediaPlayerの(IndexedTrackInfo.java)のTrackInfoに対応するインデックスで各トラックをasociateするためのカスタムPOJO:

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; 
    } 
} 

終わりに、私は利用可能を表示するSpinnerを抱えていたなかったものをユーザーにサブタイトルを付けて、それに応じて変更してください。"index"私がいた...私は、これは他の誰かを助けることができると思います

//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()); 

:あなたのニーズによって異なりますが、/ hidding /現在の字幕トラックを変える示すために、何をする必要がのようなものである

これを長い間騒がしている...これについての文書や例はあまりないようです...

関連する問題