我目前正在编写一个 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
--
第二次编辑
我知道这不是免费的脚本服务,而且我已经在以前的个人资料中提供了知识 - 但是好的,请随时不帮助我。
我被告知要显示代码的“相关部分”。我不知道该怎么做——我可以告诉你我是如何提取字幕的。我尝试了以下两个:
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)
并且 subtest 变成 subid,这取决于你的目标是什么语言。它有超过 200 行的“elseif”,以确保我击中了所有不同的组合。(如 en / sp / po 和 en / po /sp )
但这一切都与问题无关。如何从输出文件中删除不需要的行?我做了一个脚本删除行,如果下一个不以数字开头,但这对我现在没有帮助,所以没有理由发布它。
无论如何-提前感谢-感谢:)
--
第三次编辑
有人在删除之前发布了以下解决方案:
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
但是,所有这一切都会产生以下错误: