我的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
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));
Frame 1020将显示为00:00:34:00
showTwoDigits
这个帮助函数需要一个数字(例如:6),在它前面加上“00”,使它成为字符串(例如:“006”)。然后从末尾向前切片两个位置(将得到“06”)。
displayTime
var h
它通过将帧数除以60*60*30个每小时的帧数来计算小时。一个小时有60*60*30个帧。
var m
分钟的计算方式相同,通过将其除以每分钟60*30个帧来计算。但请注意,这可能会导致像80分钟这样的数字,因为它是总分钟数。脚本必须考虑在将此金额除以60后的余数。这里用到了模数。80%60将给出20,我们要找的数字。
var s
以类似的方式通过将帧除以每秒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函数的Swift版本感兴趣的人,这里是一个可用的代码示例:
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>';
请参见这个Fiddle。