Android - 用于存储视频字幕的数据结构,以便在O(1)时间内获取它们

时间:2014-03-10 01:57:51

标签: android dictionary arraylist hashmap android-mediaplayer

我正在我的应用程序中播放视频,我必须在其上显示字幕。字幕位于单独的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>&nbsp;<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>&nbsp;<br></P>
            <P Class=GBR>&nbsp;<br></P>
        </sync>
        <sync start=111160>
            <P Class=SIM>&nbsp;<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)时间内获得字幕特定时间。

EDITED

我选择了Interval Trees,这就是我需要把字幕放进去的地方:我从这里得到了它:https://github.com/phishman3579/java-algorithms-implementation

1 个答案:

答案 0 :(得分:2)

更新:刚接受:-)取消我的评论。

startTime相对于视频的开头。所以,有人知道相对于一开始的视频中的哪一个。如果当前相对时间在一定范围内,那么我可以得到副标题。我不确定Java库中的任何数据结构是否有用。看看Segment Tree/Interval Tree。它会给你更多的洞察力。我希望这可能会有所帮助。我们的想法是预处理您的SMI文件