- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在不同的文件中有多种语言的字幕。我想在看电影时更改字幕。在 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_1
和 source_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/
我正在学习WidgetMarqueeLabel课: #include "WidgetMarqueeLabel.h" #include #include WidgetMarqueeLabel::Wi
我需要使用 Graphviz DOT 打印大量图表。为了区分每个图对应的输入,我还希望每个图都有一个标题。有没有办法将它嵌入到图形的 DOT 表示中。 最佳答案 您可以使用 label为图表添加标题。
我用 jQuery 编写了一个简单的脚本,允许根据 .hover 触发器弹出和弹出标题。 问题是您必须将鼠标悬停在图像上,移回图像上,然后再次将鼠标悬停在图像上才能正常工作。 (你可以在这里明白我的意
我已经成功地将视频转换到 chromecast 现在我正在尝试添加对字幕的支持,这里我面临两个问题 当我使用 NanoHttpd 流式传输 vtt 文件时,chromecast 返回错误代码 2100
我想知道 HTML 选框是否允许在控件(或容器)的开头使用静态文本,以便当文本向左滑动时它会滑动传递文本? 例如。 我正在查看要静态对齐到左侧的日期,数据库中的文本将滑过它,然后从右侧重新出现。 HT
如何在ExoPlayer2上设置字幕?我试过这个 tu bild MergingMediaSource: SingleSampleMediaSource singleSampleSource
我正在使用 FFMPEG 使用如下命令刻录字幕: ffmpeg -i video.mp4 -vf "subtitles=subs.srt:force_style='Fontsize=24,Primar
我有一个输入文件,它基本上是一个 .ts 文件,其中包含 4 个 dvb 字幕流(嵌入其中)。我正在使用以下命令在输出视频中保留 dvb 字幕。 ffmpeg -i Input.ts -c:a cop
假设我想查找副标题中包含“法国总统选举”一词的视频列表。 我可以使用 YouTube API 做到这一点吗? 如果它甚至可以在人工生成和自动生成的字幕中搜索,那将是完美的。但是如果它可以搜索两种类型的
我正在尝试将 YouTube 视频嵌入 YouTube iframe。 视频有一个 yt:cc=on 标签,这意味着默认情况下会加载字幕。 (即使用户不想要,属性 cc_load_policy=1 也
我正在使用 ggplot2 来改进降水条形图。 这是我想要实现的可重现示例: library(ggplot2) library(gridExtra) secu <- seq(1, 16, by=2)
我正在尝试从外部 url 播放电影的字幕,但它不起作用,当我尝试添加本地存储的 vtt 文件时,它就起作用了。下面是代码 上面的代码不起作用。但是当我复制 vtt 的内容时它起作用了。 请
我有一个包含单元格的表格,其中只有在搜索了某些内容后才会出现副标题。这是 cellForRowAtIndexPath 的代码: - (UITableViewCell *)tableView:(UITa
不确定这是不是该问的地方,但我在其他地方运气不好,之前经常通过查看其他人在本网站上的问题和答案来设法找到问题的答案。 我最近安装了一个 WordPress 插件 (WP Subtitle),它允许我为
我正在使用 ActionBarSherlock 字幕并尝试使用样式更改字幕文本大小,但似乎不起作用。我对主题不太熟悉,所以..我该如何更改?? 提前致谢 最佳答案 @style/Widget
跑马灯动画不行,这是我做的。 它适用于第一个 TextView ,但不适用于第二个。我究竟做错了什么? 最佳答案 这对我
如何以编程方式获取正在播放的 YouTube 视频的字幕? 最初我尝试通过 YouTube API 离线进行, 但是 as it seems YouTube 禁止获取您不是所有者的视频的字幕。 现在我
由于 AVPlayer 渲染的隐藏式字幕有时会与其他 UI 组件重叠,我想在单独的 View 中渲染 cc。 我可以通过将 closedCaptionDisplayEnabled 设置为 NO 来关闭
这有点与 Does YouTube API forbid to download video captions if you are not it's owner? 重复的问题, Get YouTub
因此,我尝试使用默认的 chrome 发送器应用程序为 chromecast 设置隐藏式字幕,根据文档,这应该是可能的,as seen here 。我不明白为什么我的代码不起作用。它与提供的示例代码几
我是一名优秀的程序员,十分优秀!