Удаление определенных строк в файле 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
Тем не менее, все, что делает это генерирует следующую ошибку:
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.