将TIMECODE转换为帧编号的批处理

时间:2014-10-09 00:06:04

标签: windows batch-file

在批处理中有一个名为%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

等等 我该怎么办?

2 个答案:

答案 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%

此代码使用冒号作为分隔符来分割时间码变量内容。考虑零前缀字段(以八进制形式考虑并且在0809的情况下有问题),缺少或错误的格式化数据,一些"技巧"使用。

要更正小时部分,输入数据的前缀为100,此字段将以模100处理。

要处理有问题的零前缀字段,输入数据后跟冒号的冒号将替换为相同的冒号后跟空格。

为了处理缺少字段的问题,在进行计算时,所有提取的数据都以零为后缀(多用10),并且此字段中的操作结果除以10