从帧创建时间码

时间:2012-09-06 07:52:50

标签: javascript string time formatting

我的FPS(每秒帧数)为30.我到目前为止总共有FPS,比方说1020.我想将其显示为格式化的时间码,如下所示。

var fps = 30;
var currentFrame = 1020;

var resultString = ; // HH:MM:SS:FF

是否有内置的Javascript函数用于格式化?

要清楚,我需要将字符串格式化为:HH:MM:SS:FF

7 个答案:

答案 0 :(得分:3)

可以用更简单的方式完成:

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”)。

displayTime
var h
它通过将帧除以每小时60 * 60 * 30帧来计算小时数。一小时有60 * 60 * 30帧。
var m
分钟数以相同的方式计算,除以每分钟60 * 30帧。但请注意,这可能会产生80分钟的数字,因为这是总分钟数。在将此数量除以60之后,脚本必须仅考虑余数。这里模数发挥作用。 80%60将给出20,这是我们正在寻找的数字。
var s
以类似的方式,通过将帧除以每秒30帧来计算秒数,然后将其取模数60(使得65秒将表示为5)。

答案 1 :(得分:2)

您是否正在寻找内置 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;

你去。

答案 2 :(得分:1)

您也可以使用日期对象,请参阅here。只需要做出类似的事情:

var d = new Date( yourframetime + new Date().getTime() );
var str = d.getHours()+':'+ d.getMinutes()+ ':' + d.getSeconds() + ....... 

你可以使用对象的所有字符串函数,或者使用它自己创建。

答案 3 :(得分:1)

试试这个:

    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

答案 4 :(得分:0)

旧帖子,但最近我使用了这个帖子,亚历山大和卢卡斯的代码组合给出了正确的结果。检查的版本实际上打破了非常大的帧数(我认为是由于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

答案 5 :(得分:0)

对于任何对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
    }

答案 6 :(得分:0)

此功能正确转换为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>';

另见this Fiddle