dos batch:将时间转换为帧(浮点运算)

时间:2014-11-05 17:43:46

标签: windows batch-file audio dos

在变量%waveDuration%中我的持续时间为0:00:35.368667(0小时,0分钟,35秒+各种毫秒)

我希望以@25 fps PAL

的帧数转换它

使35.36 X 25 = 884,21 - >舍入= 884(结果将放入新变量%framecount%)

我尝试了2种类型的批量计算器,但我错了一些我无法解决的问题。请问我该怎么办?感谢

for /f "tokens=1-4 delims=:," %%a in (
        "%waveduration%"      
    ) do set /a "framecount"=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%d0)/10 ) * 25 / 100

并将值放在.txt

for /f "tokens=1-4 delims=:," %%a in ('c:\duration.txt') do set /a "number_Of_Frames=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%d0)/10 ) * 25 / 100"

但是,正如所说:这似乎不起作用

3 个答案:

答案 0 :(得分:2)

set "t=:%waveduration:.=:%"
for /f "tokens=1-4 delims=:" %%a in ("%t::0=: %") do set /a "framecount=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%d0)/100000 ) * 25 / 100"
echo %framecount%

将所有内容转换为百分之一秒即可运行。

已编辑:如mojo所示,此解决方案与毫秒格式紧密相关,还需要一种不同的方式来处理它们(在这种情况下,前导零是重要的)。如果它可以变化,那么

set "waveduration=0:00:35.368667"

for /f "tokens=1-4 delims=:." %%a in (":%waveduration::0=: %") do (
    set "framecount=1%%d00" 
    setlocal enabledelayedexpansion
    for /f %%x in ("!framecount:~0,3!") do ( 
        endlocal 
        set /a "framecount=((%%a00)*3600 + (%%b00)*60 + (%%c00) + (%%x-100) ) * 25 / 100"
    )
)
echo %framecount%

答案 1 :(得分:1)

CMD / Batch只进行整数运算。你必须自己做浮点数。在这个例子中,我将小数秒作为整数处理,首先乘以帧速率,然后除以推导的小数分母(10 num_digits )。 我还必须执行连续的SET /A操作,因为CMD不喜欢包含括号的表达式。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET "waveduration=0:00:35.368667"

SET FRAME_RATE=25
FOR /F "tokens=1-4 delims=:." %%a IN ("%waveduration::0=:%") DO (
    SET DENOM=1
    FOR /L %%i IN (0,1,8) DO (
        IF %%d GTR !DENOM! SET /A DENOM*=10
    )
    SET /A "framecount=(%%a*3600 + %%b*60 + %%c)*%FRAME_RATE% + %%d*%FRAME_RATE%/!DENOM!"
)
@ECHO %waveduration% : %framecount%

答案 2 :(得分:1)

在bat脚本中使用Powershell:

@echo off
SET "waveduration=0:05:35.368667"
for /f  "tokens=1-4 delims=:."  %%a in ('echo %waveduration%') do (
  for /f "delims=" %%x in ('powershell ^(0.%%d + ^(%%a * 3600^) + ^(%%b * 60^) + %%c^)*25') do echo FrameCount = %%x)