我正在我的应用程序中播放视频,我必须在其上显示字幕。字幕位于单独的smi文件中,这是一种提供字幕信息的XML标记。字幕文件看起来像这样:
.
.
.
<sync start=104600>
<P Class=GBR><i></i><span ID=style1_0><i>Born of cold and winter air</i> </span><br><i></i><span ID=style1_0><i>and mountain rain combining.</i> </span></P>
</sync>
<sync start=107080>
<P Class=MYS> <br></P>
</sync>
<sync start=107200>
<P Class=MYS><i></i><span ID=style2_0><i>...serta hujan di pergunungan.</i> </span></P>
</sync>
<sync start=110840>
<P Class=MYS> <br></P>
<P Class=GBR> <br></P>
</sync>
<sync start=111160>
<P Class=SIM> <br></P>
</sync>
<sync start=111480>
<P Class=GBR><i></i><span ID=style1_0><i>This icy force</i> </span><br><i></i><span ID=style1_0><i>both foul and fair...</i> </span></P>
</sync>
.
.
.
.
start
是在视频顶部显示字幕的时间(以毫秒为单位)。现在我正在解析使用正则表达式并创建ArrayList
SubtitleChunk
,其中包含startTime和与之关联的内容。
class SubtitleChunk {
long startTime;
String content;
}
现在,在显示视频时,我已经启动了一个单独的线程,我正在使用它从数组中获取字幕并显示它。以下是逻辑
public void run() {
while (!isFinished_) {
if (subtitleContent != null && subtitleContent.content_ != null) {
for (int i = 0; i < length; i++) {
SubtitleChunk subChunk1 = null;
SubtitleChunk subChunk2 = null;
try {
subChunk1 = subtitleContent.content_.get(i);
subChunk2 = subtitleContent.content_.get(i + 1);
long cTime = moviePlayer_.getCurrentTimeMillis();
if (cTime > subChunk1.startTime && (subChunk2 == null || cTime < subChunk2.startTime)) {
currentSub = subChunk1.content;
currentChunk = subChunk1;
break;
}
} catch (Exception e) {
DebugUtil.printLogException(VIEW_LOG_TAG, e);
currentSub = "";
}
}
} else {
currentSub = "";
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
if (moviePlayer_.isPlaying()) {
subtitleTextView.setText(Html.fromHtml(currentSub));
} else {
}
}
});
}
}
正如你所看到的,我在ArrayList上运行一个循环,并将字幕的时间与moviePlayer_.getCurrentTimeMillis()
进行比较,我认为这太贵了。和字幕滞后,与视频不同步。
以上都是对问题的解释。现在问题是......我怎样才能改进它?在O(1)时间内获得字幕特定时间。
我选择了Interval Trees,这就是我需要把字幕放进去的地方:我从这里得到了它:https://github.com/phishman3579/java-algorithms-implementation
答案 0 :(得分:2)
更新:刚接受:-)取消我的评论。
startTime
相对于视频的开头。所以,有人知道相对于一开始的视频中的哪一个。如果当前相对时间在一定范围内,那么我可以得到副标题。我不确定Java库中的任何数据结构是否有用。看看Segment Tree/Interval Tree。它会给你更多的洞察力。我希望这可能会有所帮助。我们的想法是预处理您的SMI文件