在指定时间浏览 JSON object(例如电影字幕)
Go through JSON object at specified times (e.g. movie subtitles)
首先,如果标题不够准确,请见谅,如果有人有建议,欢迎提出。我现在将解释我的问题。我有一个 JSON 文件(尽管这里是 javascript object),我想遍历它。这是电影的字幕文件,我想像您期望的那样精确地显示文本:仅在指定的时间显示。
我没有使用视频播放器或其他任何与此相关的东西,所以只有 nodejs 会通过这个文件。我确实知道如何使用简单的 for 循环遍历它,但我想知道如何遍历它并在各自 javascript objects?[=13 中指定的确切时间进行循环=]
{ 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'
},
我能想到的一个方案-
使用您的对象数组,为 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.
}
在代码中注意时差和这些微小的细节。但是,这可以用于逻辑。
首先,您必须将 startTime
和 endTime
解析为毫秒。
您可以使用 :
和 ,
字符拆分字符串,并计算它代表的毫秒数。
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);
这是有效的 fiddle,字幕时间较短:https://jsfiddle.net/6oxfx4s1/2/
首先,如果标题不够准确,请见谅,如果有人有建议,欢迎提出。我现在将解释我的问题。我有一个 JSON 文件(尽管这里是 javascript object),我想遍历它。这是电影的字幕文件,我想像您期望的那样精确地显示文本:仅在指定的时间显示。
我没有使用视频播放器或其他任何与此相关的东西,所以只有 nodejs 会通过这个文件。我确实知道如何使用简单的 for 循环遍历它,但我想知道如何遍历它并在各自 javascript objects?[=13 中指定的确切时间进行循环=]
{ 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'
},
我能想到的一个方案-
使用您的对象数组,为 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.
}
在代码中注意时差和这些微小的细节。但是,这可以用于逻辑。
首先,您必须将 startTime
和 endTime
解析为毫秒。
您可以使用 :
和 ,
字符拆分字符串,并计算它代表的毫秒数。
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);
这是有效的 fiddle,字幕时间较短:https://jsfiddle.net/6oxfx4s1/2/