Удаление определенных строк в файле SRT

В настоящее время я работаю над сценарием PS, который пройдет через всю мою библиотеку, найдет все файлы mp4 с включенными субтитрами и разделит их на файлы SRT с тем же именем, что и видеофайл.

Я делаю все это на уровне командной строки, но у меня возникают проблемы с определенным набором файлов. Всякий раз, когда я удаляю файл SRT из файла MP4, он добавляет дополнительные строки, которые путают субтитры в проигрывателе видео.

Я пробовал все (MP4Box, FFMpeg и т. Д.), Но я продолжаю получать дополнительные строки.

И вот тут вы, ребята, приходите: мне нужно, чтобы вы помогли мне разобраться, как убрать определенные строки. Позвольте мне показать вам, что я имею в виду:

Исходный файл:
[УДАЛЕНО] Редактировать: смотрите ниже, я вставил код

Требуемый выход:
[УДАЛЕНО] Редактировать: смотрите ниже, я вставил код

Заметьте меньше разрывов строк?

Любая идея о том, как я могу сделать это, используя BAT-скрипт, powershell или что-то подобное?

И решение не может состоять в том, что если новая строка не начинается с цифры, не должно быть разрыва строки. Поскольку текст (фактический текст субтитров) в файле SRT может начинаться с цифры.

Спасибо заранее - я ценю любую помощь, которую я могу получить. И извините за некоторые грамматические ошибки время от времени. 2-й язык.

-

РЕДАКТИРОВАТЬ Меня попросили вставить текст вместо скриншота:

оригинал

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

-

2-е РЕДАКТИРОВАНИЕ

Я знаю, что это не бесплатная служба сценариев, и я предоставил знания здесь, на прежнем профиле - но хорошо, не стесняйтесь, чтобы не помочь мне.

Мне сказали показать "подходящую часть" кода. Я не уверен, как это сделать - я могу показать вам, как извлечь субтитры. Я попробовал следующие два:

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"

$ Subid находится с помощью инструмента MediaInfoCLI

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

$ Ffmpegsubid - это то же самое, что и $subid, только минус 1, потому что MP4Box и FFMpeg по-разному подсчитывают потоки

$ffmpegsubid = ($subid-1)

И подтест становится субидом, в зависимости от того, к какому языку вы стремитесь. Это более 200 строк "elseif", чтобы убедиться, что я ударил все различные комбинации. (например, en / sp / po и en / po /sp)

Но это не имеет ничего общего с вопросом. Как мне удалить ненужные строки из моего выходного файла? Я сделал скрипт для удаления строк, если следующий не начинается с цифры, но это мне сейчас не помогает, поэтому нет причин размещать его.

Во всяком случае - спасибо заранее - ценю это:)

-

3-е РЕДАКТИРОВАНИЕ

Кто-то опубликовал следующее решение, прежде чем удалить его:

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

1 ответ

Вы можете попробовать это:

$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.

Другие вопросы по тегам