删除SRT文件中的特定行

时间:2017-04-22 14:13:49

标签: file powershell subtitle renaming mp4box

我目前正在制作一个PS脚本,它将遍历我的整个图书馆,找到包含字幕的所有mp4文件,并将它们剥离为与视频文件同名的SRT文件。

我在命令行级别上做了所有事情,但我遇到了一组特定文件的问题。每当我从MP4文件中剥离SRT文件时,它会添加额外的行,这会混淆视频播放器中的字幕。

我已经尝试了所有东西(MP4Box,FFMpeg等......)但我不断获得额外的线条。

这就是你们进来的地方:我需要你帮助我弄清楚如何删除特定的线条。让我告诉你我的意思:

原始档案:
[删除]编辑:请进一步查看,我已粘贴代码

需要的输出:
[删除]编辑:请进一步查看,我已粘贴代码

注意换行次数越少?

关于我如何使用BAT脚本,powershell或类似的东西帮助我的任何想法?

并且解决方案不能是如果新行不以数字开头,则不应该有换行符。因为SRT文件中的文本(实际字幕文本)可能以数字开头。

提前致谢 - 我感谢任何帮助。并且经常抱歉一些语法错误。第二语言。

-

修改 我被要求粘贴文本,而不是屏幕截图:

原始

1
00:00:10,505 --> 00:00:14,005
Some texting about the video

2
00:00:14,088 --> 00:00:17,713
Some more text

3
00:00:17,796 --> 00:00:21,463
And here it comes

Because the next line is down here

4
00:00:21,546 --> 00:00:24,255
And then it goes on and on

Everytime there is 2 lines in the same textfield

5
00:00:24,338 --> 00:00:30,338
Can you guys help me?

Thanks in advance

想要输出

1
00:00:10,505 --> 00:00:14,005
Some texting about the video

2
00:00:14,088 --> 00:00:17,713
Some more text

3
00:00:17,796 --> 00:00:21,463
And here it comes
Because the next line is down here

4
00:00:21,546 --> 00:00:24,255
And then it goes on and on
Everytime there is 2 lines in the same textfield

5
00:00:24,338 --> 00:00:30,338
Can you guys help me?
Thanks in advance

-

2ND EDIT

我知道这不是一个免费的脚本服务,我在这里提供了以前的个人资料 - 但是好的,随时都可以不帮助我。

我被告知要显示代码的“相关部分”。我不知道该怎么做 - 我可以告诉你我是如何提取副标题的。我尝试了以下两个:

Start-Process "C:\bin\FFMpeg.exe" -ArgumentList "-y -i `"$file`" -map 0:`"$ffmpegsubid`" -an -vn -c:s:0 text -f srt `"$subtitle`"" -Wait
Start-Process "C:\Program Files\GPAC\mp4box.exe" -ArgumentList "-srt `"$subid`" `"$file`" -out `"$subtitle`"" -Wait

$ subtitle-value只是输入文件名,带有SRT结尾

$subtitle = $file.Substring(0,$file.Length-3) +"srt"

使用MediaInfoCLI的工具

找到$ subid
$subtest = C:\MediaInfoCLI\MediaInfo.exe --Language=raw --Full --Inform="General;%Text_Language_List%" $file

$ ffmpegsubid与$ subid相同,只是减1,因为MP4Box和FFMpeg以不同的方式计算流

$ffmpegsubid = ($subid-1)

子测试成为subid,取决于你的目标语言。它超过200行“elseif”,以确保我击中所有不同的组合。 (如en / sp / po和en / po / sp)

但这一切都与这个问题无关。如何从输出文件中删除不需要的行?我创建了一个脚本删除行,如果下一行没有以数字开头,但这对我现在没有帮助,所以没有理由发布它。

无论如何 - 提前感谢 - 欣赏它:)

-

3RD EDIT

在删除之前,有人发布了以下解决方案:

Get-Content $file | ForEach-Object {
    if (!($previousline)) {
        $previousline
    }
    if ([Helpers]::IsNumeric($_) -and $previousline -eq "") {
        $previousline
    } elseif (!([Helpers]::IsNumeric($_)) -and $previousline -ne "") {
         $previousline
    }
    $previousline = $_
} | Set-Content $output
Get-Content $file | Select-Object -Last 1 | Add-Content $output

然而,所有这一切都会产生以下错误:

Powershell Error Message

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

$path = "" #Path File

$File = Get-Content $Path

$newFile = "$ENV:USERPROFILE\Desktop\newfile.srt" # new file

$i = 0

New-Item -Path $newFile -ItemType File | out-null

Foreach ($Line in $File) {
    $PreviousLine = $File[$i - 1]
    $NextLine = $File[$i + 1]
    $timeLine = $File[$i + 2]

    $regex = "^[0-9]+$"
    $regexTime = "^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2},[0-9]{1,3} --> [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2},[0-9]{1,3}$"

    if ($Line -ne "" -or  ($PreviousLine -ne "" -and $NextLine -match  $regex -and $timeLine -match $regexTime )) {
        Add-Content -Path $newFile -Value $Line
       }
    $i ++
}

此脚本将使用符合以下条件的行创建新文件:  1.它不是空字符串。  2.如果是空字符串,则前一行不是空字符串,下一行是数字。

您必须在变量$ Path中添加文件的路径并修改变量$ newFile。