批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[文本处理] 求助,批处理将json字幕转换为srt字幕

样本地址:下载:https://wwa.lanzoui.com/iTuAEv4z0xi 密码:bqcp
样本中有以下字符
"material_name":"笑傲江湖.EP02.2001.DVDRip.x264.AC3-CMCT.mkv","material_url":"","path":"D:/BaiduNetdiskDownload/笑傲江湖.全40集.2001.国语无字£CMCT风潇潇/笑傲江湖.EP02.2001.DVDRip.x264.AC3-CMCT.mkv"
达到:
1.srt字幕以material_name中的字符重命名,案例中就是:笑傲江湖.EP02.2001.DVDRip.x264.AC3-CMCT.srt
2.srt文件移动到path后面的目录,案例中就是:D:/BaiduNetdiskDownload/笑傲江湖.全40集.2001.国语无字£CMCT风潇潇/
3.转换为srt格式字幕

json字幕参考:https://zhuanlan.zhihu.com/p/387113572?utm_oi=792324808451964928

本帖最后由 idwma 于 2021-10-11 23:39 编辑
  1. @powershell "type '%~0'|select -skip 1|out-string|iex"&pause&exit
  2. [IO.File]::ReadAllLines("draft_content.json") -split "{"|%{
  3.   if ($_ -match '"material_name":"(.*?)","material_url":"","path":"(.*?)"'){$name=$matches[1];$path=$matches[2]}
  4.   if ($_ -match '"content":"(.*?)"'){[array]$a+=$matches[1]}
  5.   if ($_ -match '"duration":(.*?),"start":(.*?)}'){
  6.     if ($matches[2] -ne 0){
  7.       [array]$b+=(("{0:HH:mm:ss,ff}" -f [datetime]([int64]$matches[2]*10)),("{0:HH:mm:ss,ff}" -f [datetime](([int64]$matches[2]+[int64]$matches[1])*10))) -join ' --> '
  8.     }
  9.   }
  10. }
  11. for($i=0;$i -le $a.count;$i++){
  12.   $c+=($i+1),$b[$i],$a[$i],"",""
  13. }
  14. $c>([io.path]::GetDirectoryName($path)+"\"+[io.path]::GetFileNameWithoutExtension($path)+".srt")
复制代码

TOP


有弹出提示

TOP

回复 3# tianzi


    路径目录和json文件里的不一样?

TOP

本帖最后由 tianzi 于 2021-10-16 00:52 编辑

我明白了,是因为刚才那个测试的目录名是繁体字,所以报错

TOP

回复 5# tianzi


    多发几个不行的样本来测试一下

TOP

回复 6# idwma


    我明白了,是因为刚才那个测试的目录名是繁体字,所以报错

TOP

本帖最后由 tianzi 于 2021-10-16 01:27 编辑

回复 6# idwma


   可以增加一个细节吗?若存在同名文件,则保留并从2开始编号,依次下去,因为同一个视频因为时长原因,可能分多次转换


另外,时间轴跟软件在毫秒位处有差异

TOP

回复 8# tianzi


    时间是直接用json文件里的值,有差异就不知道了

TOP

回复 9# idwma


    可以增加一个细节吗?若存在同名文件,则保留并从2开始编号,依次下去,因为同一个视频因为时长原因,可能分多次转换

TOP

回复 10# tianzi

用时间简单点
  1. @powershell "type '%~0'|select -skip 1|out-string|iex"&pause&exit
  2. [IO.File]::ReadAllLines("draft_content.json") -split "{"|%{
  3.   if ($_ -match '"material_name":"(.*?)","material_url":"","path":"(.*?)"'){$name=$matches[1];$path=$matches[2]}
  4.   if ($_ -match '"content":"(.*?)"'){[array]$a+=$matches[1]}
  5.   if ($_ -match '"duration":(.*?),"start":(.*?)}'){
  6.     if ($matches[2] -ne 0){
  7.       [array]$b+=(("{0:HH:mm:ss,ff}" -f [datetime]([int64]$matches[2]*10)),("{0:HH:mm:ss,ff}" -f [datetime](([int64]$matches[2]+[int64]$matches[1])*10))) -join ' --> '
  8.     }
  9.   }
  10. }
  11. for($i=0;$i -le $a.count;$i++){
  12.   $c+=($i+1),$b[$i],$a[$i],"",""
  13. }
  14. $d=[io.path]::GetDirectoryName($path)+"\"+[io.path]::GetFileNameWithoutExtension($path)+".srt"
  15. if(test-path $d){$c>([io.path]::GetDirectoryName($path)+"\"+[io.path]::GetFileNameWithoutExtension($path)+("{0:HH.mm.ss}" -f (get-date))+".srt")}else{$c>$d}
复制代码

TOP

回复 11# idwma


    太感谢了!

TOP

返回列表