jimmy534534534534 Ответов: 2

Как разобрать файл субтитров .srt в VB.NET


Привет,

Я пытаюсь загрузить и разобрать файл субтитров .srt в VB.net. Это очень простой текстовый файл, но у меня возникли трудности.

Вот такая структура:
1
00:00:01,600 --> 00:00:04,200
English (US)

2
00:00:05,900 --> 00:00:07,999
This is a subtitle in American English
Sometimes subtitles have 2 lines

3
00:00:10,000 --> 00:00:14,000
Adding subtitles is very easy to do

**************************
* A number
   * Followed by start and end time
       * followed by the text which can be 1 or multiple lines

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

Что я уже пробовал:

у меня не было никакой удачи с вещами, которые я пробовал - я немного потерялся в этом

2 Ответов

Рейтинг:
1

OriginalGriff

Во - первых, разбейте его на разделы субтитров-они разделены пустой строкой.
Затем каждый раздел начинается с пары временных кодов, разделенных символом "-->".
Итак, прочтите весь файл с помощью File.ReadAllLines, сканирование его на наличие пустых строк с помощью строки.Метод IsNullOrWhitespace.

Затем разделите вторую строку раздела с помощью строки.Разделите, чтобы оставить начальное и конечное время в виде строк.
Обрабатывайте каждый раз используя промежуток.Метод TryParseExact (Система) | Microsoft Docs[^ а остальное-тривиально.


jimmy534534534534

Большое спасибо за ответ.
Не могли бы Вы уточнить, как именно сделать то, что вы предложили?

OriginalGriff

какая часть вышеприведенных инструкций вызывает у вас затруднения?

Рейтинг:
0

jimmy534534534534

Ну, я думаю, что я получил его - это, вероятно, не самый лучший код, но он работает:

Вот что происходит в коде:
У меня есть список с файлами .srt
Код берет файл .srt и помещает его в текстовое поле
Затем он анализирует его, начиная с последней строки, и возвращается к 20 строкам (чтобы освободить место для дополнительных разрывов строк в конце файла и т. д.
Затем он ищет первую строку, которая имеет только целое число (то есть последнюю строку)
затем он ищет строку после того, что является временным кодом
затем он берет часть справа, которая является конечным кодом
И это "длина" файла .srt

Dim appPath As String = приложение.StartupPath() ' путь к приложению
Затемните файл1 как строку

theFile1 = appPath & "\" & ListBox1.SelectedItem.ToString 'вот где у меня есть файлы .srt

Dim FILE_NAME As String = theFile1

Тусклая Текстовая Строка В Виде Строки

Если System.IO.File.Exists(FILE_NAME) = True тогда

Дим objReader, так как новая система.ИО.Что streamreader(имя_файла)

Делать, пока objReader.Peek() <> -1

TextLine = TextLine & objReader.ReadLine() & vbNewLine

Петля

TextBox7.Text = TextLine ' загрузить файл .srt в текстовое поле

Еще

Ящик для сообщений.Show("Файл Не Существует")

Конец, Если
Dim SrtTimeCode В Виде Строки
SrtTimeCode = ""

Если TextBox7.Lines.Any = True Then ' выполняется только в том случае, если текстовое поле содержит строки

Тусклая последняя строка в виде строки

Для i = от 1 до 20 'Проверьте от конца текстового файла назад 20 строк для окончательного фрагмента субтитров
строчка = TextBox7.Линий(TextBox7.Линии.Длина - i)

Если Целое Число.TryParse(lastLine, vbNull) Then ' если найдена последняя строка

SrtTimeCode = TextBox7.Lines(TextBox7.Lines.Длина - i + 1) 'последний тайм - код был найден-теперь его нужно разделить

Конец Гото
Конец, Если


Затем я
Конец, Если


конец:
Dim ChoppedSRTTimeCodeFinal As String
Dim test As String = SrtTimeCode
Dim ChoppedSRTTimeCode As String = test.Подстрока(тест.IndexOf(">"c) + 1)


'ChoppedSRTTimeCodeFinal = ChoppedSRTTimeCode.Substring(test.IndexOf(","c) + 1)
ChoppedSRTTimeCodeFinal = ChoppedSRTTimeCode.Substring(0, ChoppedSRTTimeCode.Помощи indexOf(","))

MsgBox(ChoppedSRTTimeCodeFinal) ' это последний анализируемый тайм-код