在批处理中有一个名为%timecode%的环境变量,如果时间码存在且已定义,则输出此类型的字符串:
HH:MM:SS:FF
例如01:32:21:05
在PAL模式下,25fps,我想在相应的帧编号中转换此时间码,例如在01:32:21:05的情况下是138530
所以转换处理应该输出138530
Another examples: 00:00:00:00 ----------------> 0
00:00:00:01 ----------------> 1
........
00:00:00:24 ----------------> 24
00:00:01:00 ----------------> 25
00:00:01:01 ----------------> 26
等等 我该怎么办?
答案 0 :(得分:1)
@ECHO Off
SETLOCAL
SET "timecode=01:32:21:05"
IF DEFINED timecode (
SET /a result=((1%timecode:~0,2%-100^) * 90000^) + ((1%timecode:~3,2%-100^) * 1500^) + ((1%timecode:~6,2%-100^) * 25^) + (1%timecode:~-2%-100^)
) ELSE (SET "result=NOT defined")
ECHO result with timecode="%timecode%" is %result%
SET "timecode="
IF DEFINED timecode (
SET /a result=((1%timecode:~0,2%-100^) * 90000^) + ((1%timecode:~3,2%-100^) * 1500^) + ((1%timecode:~6,2%-100^) * 25^) + (1%timecode:~-2%-100^)
) ELSE (SET "result=NOT defined")
ECHO result with timecode="%timecode%" is %result%
GOTO :EOF
这应该指向一个解决方案。
请注意,仅在^
之前需要插入符号()
),因为set
命令在块中。如果goto
未定义timecode
,则选择1
标签,则不需要插入符号。
我已经考虑使用直接的方法来计算总和;在100
前加上两个数字,然后减去08/09
(它处理cmd
问题 - 前导0定义为八进制,magic numbers
将反对非八进制字符)使用{{1}}可以使例程更简单,但这需要更多解释。
答案 1 :(得分:1)
@echo off
setlocal enableextensions disabledelayedexpansion
set "frameRate=25"
set "timecode=01:32:21:05"
for /f "tokens=1-4 delims=:" %%a in (
"100%timecode::0=: %"
) do set /a "frame=((%%a %% 100)*3600 + (%%b0)*60/10 + (%%c0)/10) * %frameRate% + (%%d0)/10"
echo %frame%
此代码使用冒号作为分隔符来分割时间码变量内容。考虑零前缀字段(以八进制形式考虑并且在08
或09
的情况下有问题),缺少或错误的格式化数据,一些"技巧"使用。
要更正小时部分,输入数据的前缀为100
,此字段将以模100处理。
要处理有问题的零前缀字段,输入数据后跟冒号的冒号将替换为相同的冒号后跟空格。
为了处理缺少字段的问题,在进行计算时,所有提取的数据都以零为后缀(多用10),并且此字段中的操作结果除以10