1

首先,对不起,如果标题不够精确,如果有人有建议,欢迎他们。我现在将解释我的问题。我有一个 JSON 文件(虽然这里是一个 javascript 对象),我想循环访问它。这是电影的字幕文件,我想完全按照您的预期显示文本:仅在指定的时间。

我没有使用视频播放器或其他任何东西,所以它只会是 nodejs 通过这个文件。我确实知道如何使用简单的 for 循环遍历它,但我想知道如何遍历它并在相应的 javascript 对象中指定的时间执行此操作?

 { id: '54',
    startTime: '00:03:46,572',
    endTime: '00:03:53,160',
    text: 'Hello this is a text' 
 },
 { id: '55',
    startTime: '00:03:53,160',
    endTime: '00:03:58,799',
    text: 'To be precise, the subtitle file of a movie' 
 },
4

2 回答 2

2

首先,您必须将startTimeand解析endTime为毫秒。

您可以使用:and,字符打破字符串,并计算它代表的毫秒数。

function parseTime(t) {
    var segments = t.split(':');
    var ms = parseInt(segments[2].split(',')[1]);
    var h = parseInt(segments[0]);
    var m = parseInt(segments[1]);
    var s = parseInt(segments[2]);
    return h * 60 * 60 * 1000 + m * 60 * 1000 + s * 1000 + ms;
}

接下来,检查您的数组,并将时间转换为毫秒:

function convertToMs(arr) {
    for (var i = 0; i < arr.length; i++) {
        arr[i].startTime = parseTime(arr[i].startTime);
        arr[i].endTime= parseTime(arr[i].endTime);    
    }
    return arr;
}

现在,从数组中的第一个元素开始,并在每次调用时为下一个元素设置回调,除非您已到达数组的末尾。

function showSubtitles(arr, i) {
    setTimeout(function() {
        console.log(arr[i].text);
        setTimeout(console.clear, arr[i].endTime - arr[i].startTime); // Make the subtitle "disappear"
        i++;
        if (arr.length > i) {
            showSubtitles(arr, i);
        }
    }, i == 0 ? (arr[i].startTime) : (arr[i].startTime - arr[i-1].startTime));
}

现在使用你的数组:

var subtitles = [{
        id: '54',
        startTime: '00:03:46,572',
        endTime: '00:03:53,160',
        text: 'Hello this is a text' 
    },
    { 
        id: '55',
        startTime: '00:03:53,160',
        endTime: '00:03:58,799',
        text: 'To be precise, the subtitle file of a movie' 
    }];
subtitles = convertToMs(subtitles);
showSubtitles(subtitles, 0);

这是一个工作小提琴,字幕时间较短:https ://jsfiddle.net/6oxfx4s1/2/

于 2017-01-17T12:27:44.413 回答
1

我能想到的一种解决方案-

startTime使用您的对象数组,为和之间的时间差设置超时endTime

一旦时间上的时间差完成,就会拾取下一个对象进行处理或显示(基本上是您的目的)

var textarr =  [{ id: '54',
    startTime: '00:03:46,572',
    endTime: '00:03:53,160',
    text: 'Hello this is a text' 
 },
 { id: '55',
    startTime: '00:03:53,160',
    endTime: '00:03:58,799',
    text: 'To be precise, the subtitle file of a movie' 
 }]

var i=0;

function getText(textarr,i){
    setTimeout(function(){
        console.log(textarr[i].text);
        i++;
        getText(textarr,i)
    },textarr[i].endTime-textarr[i].startTime) //take care of the difference of time.
}

注意代码中的时差和这些微小的细节。但是,这可以用于逻辑。

于 2017-01-17T11:34:00.263 回答