我有一个包含数千个子文件夹的文件夹,每个子文件夹包含一个视频文件和一个字幕文件,如下所示:
每个文本文件(.srt)都是字幕文件,用于在每个视频的开头和结尾显示文件名(不带扩展名)。例如,Track Two - Track Two.srt的内容是:
1
00:00:00,500 --> 00:00:03,500
Track Two - Track Two
2
00:00:00,000 --> 00:00:00,000
Track Two - Track Two
感谢一些严肃的StackHeads,我已经能够通过在./media/父目录中运行以下批处理脚本来自动创建文本文件:
for /R %%f in (*.flv *.mp4) do (
echo(1
echo(00:00:00,500 --^> 00:00:03,500
echo(%%~nf
echo(
echo(2
echo(00:00:00,000 --^> 00:00:00,000
echo(%%~nf
) > "%%~dpnf.srt"
现在我要做的就是更新每个.srt文件的第六行,使其在视频结束前显示三秒钟的文件名。理想情况下,第一个数值在视频结束前3.5秒,第二个值在结束前0.5秒......并且为了使其更难,它必须在俄罗斯时间码.srt文件使用。
例如,如果Track Two - Track Two长度为01:36,则Track Two的第6行 - Track Two.srt应为:
00:01:32,500 --> 00:01:35,500
我可以生成所有视频长度的文本列表,如下所示:
..只要我保持文件夹名称严格编号,它们就会每次排队。
有没有办法从文本文件times.txt中提取视频长度(假设顺序是完美的),并以俄语时间码格式更新每个.srt文件的第6行,使其显示之前的标题它引用的视频文件结束了吗?
任何帮助都是慷慨的赞赏!! 另外..再次感谢dbenham,MC ND,payeli之前的帮助!!你是最棒的!
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "skip=1tokens=2,3,11delims=," %%a IN (list.csv) DO (
SET ttrack=%%a
SET videoname=%%~nb
set to_file="%%c\%%~nb.srt"
CALL :process
)
GOTO :EOF
:process
FOR /f "tokens=1-3delims=:" %%r IN ("%ttrack%") DO (
SET /a hr=10%%r
SET /a mi=1%%s
SET /a se=1%%t
)
CALL :subs 1
SET endtime=%hr:~-2%:%mi:~-2%:%se:~-2%,500
CALL :subs 3
SET starttime=%hr:~-2%:%mi:~-2%:%se:~-2%,500
echo(1
echo(00:00:00,500 --^> 00:00:03,500
echo(!videoname!
echo(
echo(2
echo(%starttime% --^> %endtime%
echo(!videoname!
ECHO(sent to %to_file%
GOTO :eof
::
:: subtract %1 seconds from hr,mi,se
::
:subs
SET /a se-=%1
IF %se% geq 100 GOTO :EOF
SET /a se+=60
SET /a mi-=1
IF %mi% geq 100 GOTO :EOF
SET /a mi+=60
SET /a hr-=1
GOTO :eof
不难。
如果这似乎合适,你需要做的就是改变
echo(1
...
echo(%videoname%
ECHO(sent to %to_file%
到
(
echo(1
...
echo(%videoname%
)>%to_file%