私のFPS(フレーム/秒)は30です。これまでの合計FPSは、たとえば1020です。これを次のようにフォーマットされたタイムコードとして表示したいと思います。
var fps = 30;
var currentFrame = 1020;
var resultString = ; // HH:MM:SS:FF
このようなフォーマット用に組み込まれているJavascript関数はありますか?
明確にするために、文字列を次のようにフォーマットする必要があります:HH:MM:SS:FF
私のFPS(フレーム/秒)は30です。これまでの合計FPSは、たとえば1020です。これを次のようにフォーマットされたタイムコードとして表示したいと思います。
var fps = 30;
var currentFrame = 1020;
var resultString = ; // HH:MM:SS:FF
このようなフォーマット用に組み込まれているJavascript関数はありますか?
明確にするために、文字列を次のようにフォーマットする必要があります:HH:MM:SS:FF
それははるかに簡単な方法で行うことができます:
function displayTime(currentFrame) {
var fps = 30;
var h = Math.floor(currentFrame/(60*60*fps));
var m = (Math.floor(currentFrame/(60*fps))) % 60;
var s = (Math.floor(currentFrame/fps)) % 60;
var f = currentFrame % fps;
return showTwoDigits(h) + ":" + showTwoDigits(m) + ":" + showTwoDigits(s) + ":" + showTwoDigits(f);
}
function showTwoDigits(number) {
return ("00" + number).slice(-2);
}
console.log("Frame 1020 will be displayed as " + displayTime(1020));
フレーム1020は00:00:34:00として表示されます
showTwoDigits
このヘルプ関数は数値(例:6)を取り、その前に「00」を追加して文字列にします(例:「006」)。次に、最後から2つの位置にスライスバックします(「06」が表示されます)。
displayTimevarh
フレームを1時間あたり60*60*30フレームで割って時間を計算します
。
1時間には60*60*30フレームがあります。
var m
Minutesは、60*30フレーム/分で割って同じ方法で計算されます。ただし、これは合計分数であるため、80分程度になる可能性があることに注意してください。スクリプトは、この量を60で割った後の余りのみを考慮に入れる必要があります。ここで、モジュラスが機能します。80%60は、私たちが探している数を20に与えます。
var s
同様の方法で、秒はフレームを1秒あたり30フレームで除算し、モジュラス60(65秒は5として表される)で計算されます。
組み込みのJS関数をお探しですか?..
var FF = currentFrame % fps;
var seconds = (currentFrame - FF) / fps;
var SS = seconds % 60;
var minutes = (seconds - SS) / 60;
var MM = minutes % 60;
var HH = (minutes - MM) / 60;
どうぞ。
日付オブジェクトを使用することもできます。ここを参照してください。次のようなものを作成します。
var d = new Date( yourframetime + new Date().getTime() );
var str = d.getHours()+':'+ d.getMinutes()+ ':' + d.getSeconds() + .......
オブジェクトのすべての文字列関数を使用したり、独自に作成したりすることができます。
これを試して:
var fps = 30;
var currentFrame = 169;
var SS = Math.floor(currentFrame / fps);
var MM = Math.floor(SS / 60);
var HH = Math.floor(MM / 60);
var FF = currentFrame - (SS * fps);
function pad(str, width, what, left) {
str = String(str);
what = String(what);
var w = width - str.length;
if (left) {
return (new Array(w + 1)).join(what) + str;
} else {
return str + (new Array(w + 1)).join(what);
}
}
var i,
timecode = [HH, MM, SS, FF];
for (i = 0; i < timecode.length; i += 1) {
timecode[i] = pad(timecode[i], 2, 0, true);
}
var resultString = timecode.join(':'); // HH:MM:SS:FF
古い投稿ですが、最近これを使用していて、AlexanderとLucasのコードを組み合わせて正しい結果が得られました。チェックされたバージョンは、実際には非常に大きなフレーム数で壊れます(Math.floorが原因だと思います)。
コードは次のとおりです。
var fps = 30;
var currentFrame = 169;
var FF = currentFrame % fps;
var seconds = (currentFrame - FF) / fps;
var SS = seconds % 60;
var minutes = (seconds - SS) / 60;
var MM = minutes % 60;
var HH = (minutes - MM) / 60;
function pad(str, width, what, left) {
str = String(str);
what = String(what);
var w = width - str.length;
if (left) {
return (new Array(w + 1)).join(what) + str;
} else {
return str + (new Array(w + 1)).join(what);
}
}
var i,
timecode = [HH, MM, SS, FF];
for (i = 0; i < timecode.length; i += 1) {
timecode[i] = pad(timecode[i], 2, 0, true);
}
var resultString = timecode.join(':'); // HH:MM:SS:FF
迅速なバージョンのshowTwoDigits関数に関心のある方は、次のコードサンプルをご覧ください。
func showTwoDigits(number:Float) -> (String){
var string = ("00" + String(format:"%.f", number))
var range = Range(start: (advance(string.endIndex, -2)), end: string.endIndex)
var cutStr = string.substringWithRange(range)
return cutStr
}
HH:MM:SS:FF
この関数は正しく変換されます:
var convertTime = function (frames, fps) {
fps = (typeof fps !== 'undefined' ? fps : 30 );
var pad = function(input) {return (input < 10) ? "0" + input : input;},
seconds = (typeof frames !== 'undefined' ? frames / fps : 0 );
return [
pad(Math.floor(seconds / 3600)),
pad(Math.floor(seconds % 3600 / 60)),
pad(Math.floor(seconds % 60)),
pad(Math.floor(frames % fps))
].join(':');
}
var convertTime = function (frames, fps) {
fps = (typeof fps !== 'undefined' ? fps : 30 );
var pad = function(input) {return (input < 10) ? "0" + input : input;},
seconds = (typeof frames !== 'undefined' ? frames / fps : 0 );
return [
pad(Math.floor(seconds / 3600)),
pad(Math.floor(seconds % 3600 / 60)),
pad(Math.floor(seconds % 60)),
pad(Math.floor(frames % fps))
].join(':');
}
document.body.innerHTML = '<pre>' + JSON.stringify({
5 : convertTime(5),
50 : convertTime(50),
126 : convertTime(126),
1156 : convertTime(1156),
9178 : convertTime(9178),
13555 : convertTime(13555)
}, null, '\t') + '</pre>';
このフィドルも参照してください。