找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 61124|回复: 15

[文本处理] [已解决]批处理把srt字幕显示持续时间缩短

[复制链接]
发表于 2022-8-31 14:02:04 | 显示全部楼层 |阅读模式
本帖最后由 vwfgh 于 2022-9-1 08:00 编辑

我有这样的双语字幕,每句字幕的结束时间是下一句字幕的开始时间,但是有时候两句话之间相隔很长时间,那上一句话的字幕就会一直显示。

我想改成,如果两句字幕相隔时间小于5秒,那就按原来的方案处理。如果大于5秒,那上一句字幕的持续时间就改成5秒,请问这种能用脚本实现吗?

下面是字幕例子。

1
00:00:06,058 --> 00:00:07,578
안녕하세.
你好。

2
00:00:07,578 --> 00:00:10,938
여러분.
各位。

3
00:00:10,938 --> 00:00:12,238
안녕하세요.
你好。
发表于 2022-8-31 17:46:46 | 显示全部楼层
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $srt='字幕.srt'
  3. $s=[timespan]::FromSeconds(5)
  4. sc -enc utf8 $srt $(
  5.     type $srt|%{
  6.         if($_ -match '-->'){
  7.             $a=$_ -replace ',','.' -split '\s+-->\s+'
  8.             $f=[datetime]$a[0]
  9.             $l=[datetime]$a[1]
  10.             if($l-$f -gt $s){'{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}' -f $f,($f+$s)}else{$_}
  11.         }else{$_}
  12.     }
  13. )
复制代码
 楼主| 发表于 2022-8-31 19:13:35 | 显示全部楼层
运行出错了
 楼主| 发表于 2022-8-31 19:14:22 | 显示全部楼层
回复 2# idwma


大佬 我运行后提示:
type : 找不到路径“H:\test\瀛楀箷.srt”,因为该路径不存在。
所在位置 行:5 字符: 5
+     type $srt|%{
+     ~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (H:\test\瀛楀箷.srt:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

请按任意键继续. . .

然后出现个 瀛楀箷.srt 的空白文档,不知道哪错了?
发表于 2022-8-31 20:11:31 | 显示全部楼层
回复 4# vwfgh


    复现不了你的情况,不知道呀
发表于 2022-8-31 20:13:33 | 显示全部楼层
本帖最后由 fzp070 于 2022-8-31 20:21 编辑

回复 4# vwfgh

这个乱码,感觉是编码格式的问题啊,将bat文件保存为ANSI编码格式,字幕文件也是ANSI编码。
如果保存为UTF-8的编码,那就在代码最前面加上 chcp 65001>nul,试试看
 楼主| 发表于 2022-8-31 20:15:23 | 显示全部楼层
回复 6# fzp070


保存完ansi后显示:

type : 找不到路径“H:\test\字幕.srt”,因为该路径不存在。
所在位置 行:5 字符: 5
+     type $srt|%{
+     ~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (H:\test\字幕.srt:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
 楼主| 发表于 2022-8-31 20:17:49 | 显示全部楼层
保存完ansi后,执行两次脚本不提示错误了,但是生成的文件还是空白。
发表于 2022-8-31 20:18:18 | 显示全部楼层
本帖最后由 fzp070 于 2022-8-31 20:20 编辑

回复 7# vwfgh
回复 5# idwma

powershell我不懂,得2楼大佬idwma帮忙解答
 楼主| 发表于 2022-8-31 20:28:55 | 显示全部楼层
回复 9# fzp070


谢谢帮助
发表于 2022-8-31 20:39:05 | 显示全部楼层
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $s=[timespan]::FromSeconds(5)
  3. dir *.srt|%{
  4. $srt=$_.fullname
  5. sc -enc utf8 $srt $(
  6.     type $srt|%{
  7.         if($_ -match '-->'){
  8.             $a=$_ -replace ',','.' -split '\s+-->\s+'
  9.             $f=[datetime]$a[0]
  10.             $l=[datetime]$a[1]
  11.             if($l-$f -gt $s){'{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}' -f $f,($f+$s)}else{$_}
  12.         }else{$_}
  13.     }
  14. )
  15. }
复制代码
 楼主| 发表于 2022-8-31 21:05:53 | 显示全部楼层
回复 11# idwma


谢谢大佬!辛苦了!这次可以了。

但是我发现个奇怪的bug,当文件名里有 [ 这个符号时,脚本就会无法执行,提示:

标题中只有[时:

Get-Content : 无法检索 cmdlet 的动态参数。指定的通配符模式无效: [.srt
所在位置 行:6 字符: 5
+     type $srt|%{
+     ~~~~~~~~~
    + CategoryInfo          : InvalidArgument: ( [Get-Content],ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.GetContentCommand

Set-Content : 无法检索 cmdlet 的动态参数。指定的通配符模式无效: [.srt
所在位置 行:5 字符: 1
+ sc -enc utf8 $srt $(
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Content],ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.SetContentCommand



标题中包含[时:

type : 指定路径 H:\test\完整版[ABCD].srt 处的某个对象不存在,或者已被 -Include 或 -Exclude 参数过滤掉。
所在位置 行:6 字符: 5
+     type $srt|%{
+     ~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception
    + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Set-Content : 找不到与参数名称“enc”匹配的参数。
所在位置 行:5 字符: 4
+ sc -enc utf8 $srt $(
+    ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Content],ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SetContentCommand

而且]这个符号是可以的,很奇怪。
发表于 2022-8-31 22:03:23 | 显示全部楼层
回复 12# vwfgh


    这个还真没碰到过呀
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $s=[timespan]::FromSeconds(5)
  3. dir *.srt|%{
  4. $srt=$_.fullname
  5. [io.file]::WriteAllLines($srt,$(
  6.     [io.file]::ReadAllLines($srt)|%{
  7.         if($_ -match '-->'){
  8.             $a=$_ -replace ',','.' -split '\s+-->\s+'
  9.             $f=[datetime]$a[0]
  10.             $l=[datetime]$a[1]
  11.             if($l-$f -gt $s){'{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}' -f $f,($f+$s)}else{$_}
  12.         }else{$_}
  13.     })
  14. )
  15. }
复制代码

评分

参与人数 1技术 +1 收起 理由
vwfgh + 1 正确解答

查看全部评分

 楼主| 发表于 2022-9-1 07:56:48 | 显示全部楼层
回复 13# idwma


完全OK了,感谢耐心解答!!!
发表于 2022-9-1 14:01:56 | 显示全部楼层
Test.bat,编码为utf8 without BOM
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 65001

  4. for /f "delims=" %%i in ('dir /b *.srt') do (
  5.     (for /f "delims=" %%j in ('findstr /n .* "%%i"') do (
  6.         set "s=%%j"
  7.         if "!s: --> =!" NEQ "!s!" (
  8.             set "s=!s:*:=!"
  9.             for /f "tokens=1-8 delims=:,-> " %%A in ("!s!") do (
  10.                 set /a T1 = "((1%%A - 100) * 3600 + (1%%B - 100) * 60 + (1%%C - 100)) * 1000 + 1%%D - 1000"
  11.                 set /a T2 = "((1%%E - 100) * 3600 + (1%%F - 100) * 60 + (1%%G - 100)) * 1000 + 1%%H - 1000"
  12.                 set /a x = T2 - T1
  13.                 if !x! GTR 5000 (
  14.                     set /a T2 = T1 + 5000, ms = T2 %% 1000 + 1000, T2 /= 1000
  15.                     set /a HH = T2 /3600 + 100, mm = T2 %% 3600 / 60 + 100, ss = T2 %% 60 + 100
  16.                     set "s=%%A:%%B:%%C,%%D --> !HH:~1!:!mm:~1!:!ss:~1!,!ms:~1!"
  17.                 )
  18.             )
  19.         ) else (
  20.             set "s=!s:*:=!"
  21.         )
  22.         echo;!s!
  23.     )) > "%%i.~tmp"
  24.     move "%%i.~tmp" "%%i"
  25. )
  26. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 17:22 , Processed in 0.018237 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表