gpt4 book ai didi

android - 如何在 VideoView 中更改字幕

转载 作者:行者123 更新时间:2023-11-29 17:11:15 24 4
gpt4 key购买 nike

我在不同的文件中有多种语言的字幕。我想在看电影时更改字幕。在 android VideoView 中使用 addSubtitleSource() 方法更改字幕的正确方法是什么?

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

如果我停止并开始播放视频,那么我可以使用此代码在字幕之间切换(可能是因为在重新启动视频后它“忘记”了添加的子源)。有没有办法在不重新加载视频的情况下卸载一个字幕源并添加不同的字幕源?我在想像 removeSubtitleSource() 这样不存在的方法。

编辑:也许我可以为此使用 CaptioningManger?

最佳答案

我知道你的问题来晚了,但也许答案可以帮助其他人......我最近刚在研究这个,需要更改 VideView 显示字幕的相同功能。

首先,在初始化 VideoView 时添加两个字幕(source_1source_2)。

然后,您可以做的是,在 VideoView 对象的 onPrepared() 监听器内部,您可以遍历当前播放视频可用的轨道,我所做的是将它们保存到类中声明的 map 中:

对附加到您的 videoView 的 MediaPlayer 的所需引用、可用字幕轨道的映射和当前选定的字幕轨道是在我的 fragment 上声明的私有(private)类成员,该 fragment 包含 VideoView:

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

onPrepared监听器的内容

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

自定义 POJO 将每个轨道与其在 mediaPlayer 的 TrackInfo 中的相应索引相关联(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;
}
}

最后,我做了一个 Spinner 来向用户显示可用的字幕并根据它的 “索引” 更改它们。

这取决于您的需要,但要显示/隐藏/更改当前字幕轨道,您需要做的是:

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

我希望这可以帮助其他人...我为此苦苦挣扎了很长时间...似乎还没有太多关于此的文档或示例...

关于android - 如何在 VideoView 中更改字幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40466918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com