kingslay / KSPlayer

A video player for iOS、macOS、tvOS、visionOS , based on AVPlayer and FFmpeg, support the horizontal, vertical screen. support adjust volume, brightness and seek by slide, support subtitles.
GNU General Public License v3.0
886 stars 184 forks source link

srt多行字幕解析有问题 #682

Closed FaiChou closed 7 months ago

FaiChou commented 7 months ago

如果遇到多行文本时候,解析会出错。

可以跑一下这个测试: https://github.com/kingslay/KSPlayer/blob/develop/Tests/KSPlayerTests/SubtitleTest.swift#L4

有问题的代码应该是这附近: https://github.com/kingslay/KSPlayer/blob/develop/Sources/KSPlayer/Subtitle/KSParseProtocol.swift#L432

下面是我 parse 的测试结果:

==start==
00:00:00,050  00:00:11,000 本字幕仅供学习交流,严禁用于商业用途
==end==
==start==
00:00:13,000  00:00:18,000 翻译:风铃
==end==
==start==
校对&时间轴:小白

3
00:01:00,840  00:01:02,435 你现在必须走了吗?
==end==
==start==
00:01:02,680  00:01:04,318 我说过我会去找他的
==end==
==start==
00:01:07,194  00:01:08,239 - 很多事情我们都说过
==end==
==start==
我承诺过他

6
00:01:08,280  00:01:10,661 我希望你明白
==end==
==start==
00:01:12,814  00:01:14,702 等等! 你是不可能活着回来的!
==end==
FaiChou commented 7 months ago

有点奇怪, 下面这段代码中, newLine = scanner.scanCharacters(from: .newlines) 总是 nil :

            repeat {
                if let str = scanner.scanUpToCharacters(from: .newlines) {
                    text += str
                }
                newLine = scanner.scanCharacters(from: .newlines)
                if newLine == "\n" {
                    text += "\n"
                }
            } while newLine == "\n"
kingslay commented 7 months ago

我在intel的设备上跑SubtitleTest 这个test是成功的,parts.count返回的是7。

kingslay commented 7 months ago

需要改字幕的内容吗?

FaiChou commented 7 months ago

我在intel的设备上跑SubtitleTest 这个test是成功的,parts.count返回的是7。

count 应该是没问题的,但解析是有问题的。

你跑下这个:

let text1 = """
第一行
第二行
"""
let text2 = "abc\ndef"
let scanner = Scanner(string: text1)
var text = ""
var newLine: String?
if let str = scanner.scanUpToCharacters(from: .newlines) {
    text += str
}
print(text) // 第一行
newLine = scanner.scanCharacters(from: .newlines)
print(newLine) // nil

这个 newLine 是不是空。在我的电脑上 text1 和 text2 测试都是空。

kingslay commented 7 months ago

我的这个test里面返回的内容哪里有问题呢?我看了返回的文案是有两行的。你可以为我的这个test增加XCTAssertEqual。然后我看下对不对。

FaiChou commented 7 months ago

哦今天测试了下,确实不是这个地方导致的bug,我忽略了 scaner.charactersToBeSkipped = nil

但有些 SRT 字幕就是有问题, 我打印了一下,好几百条字幕同时出现:

var body: some View {
        VStack {
            Spacer()
            let _ = print(model.parts.count)
            ForEach(model.parts) { part in
                part.subtitleView
            }

字幕文件我发你邮箱。