2017-01-17 7 views
0

まず、タイトルが正確ではない場合は、誰かが最も歓迎されている提案がある場合は申し訳ありません。私は今問題を説明します。私はJSONファイル(ここではjavascriptオブジェクトですが)を持っていますが、これはループしたいものです。これは映画の字幕ファイルなので、指定した時刻にのみ、正確にテキストを表示したいと思います。JSONオブジェクトを指定された時間(たとえば映画の字幕)で移動します。

私はビデオプレイヤーまたはこれに関連する他のものを使用していないため、このファイルを経由するnodejのみです。私は単純な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' 
}, 

答えて

1

最初に、startTimeendTimeをミリ秒に解析する必要があります。

:文字と,文字を使用して文字列を区切り、それが表すミリ秒を計算できます。

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/

+0

これは素晴らしい答えです、どうもありがとう。この答えで、字幕の表示を一時停止し、再びそれを再開する可能性はありますか? (私はこれが私の最初の質問ではないことを知っていますが、私はこの解決策にどのように合うか疑問に思っています) –

+0

本当の字幕のように "行為"させることを意味するならば、私は、字幕が消えるべきときに、コンソールをクリアする答えを更新しました。また、divにそれを表示するために、フィドルへのアップデートを追加しました。 –

+0

ああ、私はそれを意味しませんでした。私は、字幕ファイルを通って一時停止し、停止した時点で再開するボタンを持っていたいと思います。しかし、私はどのようにこれを実装することができないのか、それがどれほど難しいかはわかりません。 –

0

一つの解決策は、startTimeendTime間の時間差のためにタイムアウトを設定します。 (基本的にはあなたの目的)

時間の時間差が完了すると、次のオブジェクトが処理のためにピックアップまたは表示している

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. 
} 

コードの時間差と、このような微細な細部の世話をします。しかし、これはロジックに使用できます。

関連する問題