Javascript 从帧创建时间码

Javascript 从帧创建时间码,javascript,string,time,formatting,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您正在寻找内置的JS函数吗 var FF = currentFrame % fps; var seconds =

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

var fps = 30;
var currentFrame = 1020;

var resultString = ; // HH:MM:SS:FF
是否有任何内置的Javascript函数用于这样的格式设置


为了清楚起见,我需要将字符串的格式设置为:HH:MM:SS:FF

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

好了。

您也可以使用date对象查看。只需制作如下内容:

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
var fps=30;
var currentFrame=169;
var SS=数学楼层(当前帧/fps);
var MM=数学地板(SS/60);
var HH=数学地板(MM/60);
var FF=当前帧-(SS*fps);
功能板(str,宽度,什么,左侧){
str=字符串(str);
what=字符串(what);
var w=宽度-长度;
如果(左){
return(新数组(w+1)).join(what)+str;
}否则{
返回str+(新数组(w+1)).join(what);
}
}
var i,
时间码=[HH,MM,SS,FF];
对于(i=0;i
以前的帖子,但我最近使用了这个,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
var fps=30;
var currentFrame=169;
var FF=当前帧%fps;
var秒=(当前帧-FF)/fps;
var SS=秒%60;
var分钟=(秒-SS)/60;
var MM=分钟%60;
var HH=(分钟-毫米)/60;
功能板(str,宽度,什么,左侧){
str=字符串(str);
what=字符串(what);
var w=宽度-长度;
如果(左){
return(新数组(w+1)).join(what)+str;
}否则{
返回str+(新数组(w+1)).join(what);
}
}
var i,
时间码=[HH,MM,SS,FF];
对于(i=0;i
可以用更简单的方法完成:

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

显示两位数
此帮助函数接受一个数字(例如:6),在其前面添加“00”,使其成为一个字符串(例如:“006”)。然后从末端向后切2个位置(将给出“06”)

显示时间
var h
它通过将帧除以每小时60*60*30帧来计算小时数。一小时有60*60*30帧
var m
分钟数的计算方法相同,即除以60*30帧/分钟。但请注意,这可能会导致80分钟这样的数字,因为这是总分钟数。脚本必须只考虑将该金额除以60后的余数。在这里,模数起作用。80%60将给出20,这是我们正在寻找的数字
var s

以类似的方式,通过将帧除以每秒30帧,然后取模数60来计算秒数(因此65秒将表示为5)

对于任何对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=函数(帧,fps){
fps=(fps的类型!=‘未定义’?fps:30);
var pad=函数(输入){返回(输入<10)?“0”+输入:输入;},
秒数=(帧类型!=“未定义”?帧/fps:0);
返回[
pad(数学楼层(秒/3600)),
pad(数学地板(秒数%3600/60)),
pad(数学地板(秒数%60)),
pad(数学楼层(帧数%fps))
]。加入(“:”);
}

演示
var convertTime=函数(帧,fps){
fps=(fps的类型!=‘未定义’?fps:30);
var pad=函数(输入){返回(输入<10)?“0”+输入:输入;},
秒数=(帧类型!=“未定义”?帧/fps:0);
返回[
pad(数学楼层(秒/3600)),
pad(数学地板(秒数%3600/60)),
pad(数学地板(秒数%60)),
pad(数学楼层(帧数%fps))
]。加入(“:”);
}
document.body.innerHTML=''+JSON.stringify({
5:转换时间(5),
50:转换时间(50),
126:转换时间(126),
1156:转换时间(1156),
9178:转换时间(9178),
13555:转换时间(13555)

},空,'\t')+''为了清楚起见,我需要将字符串格式化为:HH:MM:SS:ffs。我不确定我是否能理解,你能对此进行扩展吗?非常好-我注意到一个奇怪的现象,当你有一个169的当前帧时,它显示00:00:06:-11和一个负号?有什么想法吗?这太完美了,而且比我更有帮助。但愿我能投更多的票。:)如果您想知道错误来自于使用Math.round而不是Math.floorSS MM和HH,那么实际上总秒数、分钟数和小时数。例如,1小时时间将变为[1,60,3600,FF]您的时间码模式是什么?你担心吊篮吗?