2013-01-02 2 views
1

Я работаю над веб-приложением, которое может принимать файлы субтитров в формате Time Text Markup (TTML) или WebVTT. Если файл имеет временный текст, я хочу перевести его на WebVTT. Это в основном не проблема, одна проблема, с которой я столкнулся, заключается в том, что если TTML имеет HTML как часть текстового содержимого, то теги HTML будут удалены.Анализ XML для преобразования временной разметки текста в WebVTT

Например:

<p begin="00:00:08.18" dur="00:00:03.86">(Music<br />playing)</p> 

приводит:

(Musicplaying) 

код, который я использую:

private const string TIME_FORMAT = "hh\\:mm\\:ss\\.fff"; 
XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load(fileLocation); 
XDocument xdoc = xmldoc.ToXDocument(); 
var ns = (from x in xdoc.Root.DescendantsAndSelf() 
      select x.Name.Namespace).First(); 

List<TTMLElement> elements = 
(
    from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p") 
    select new TTMLElement 
    { 
      text = item.Value, 
      startTime = TimeSpan.Parse(item.Attribute("begin").Value), 
      duration = TimeSpan.Parse(item.Attribute("dur").Value), 
    } 
).ToList<TTMLElement>(); 

StringBuilder sb = new StringBuilder(); 
sb.AppendLine("WEBVTT"); 
sb.AppendLine(); 

for (int i = 0; i < elements.Count; i++) 
{ 
    sb.AppendLine(i.ToString()); 
    sb.AppendLine(elements[i].startTime.ToString(TIME_FORMAT) + " --> " + elements[i].startTime.Add(elements[i].duration).ToString(TIME_FORMAT)); 
    sb.AppendLine(elements[i].text); 
    sb.AppendLine(); 
} 

Любые мысли о том, что я отсутствует или если есть только лучший способ сделать это или даже если уже есть решение для преобразования Time Text в WebVTT, будет оценено по достоинству. Благодарю.

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Спасибо, даже не подумал об этом. – HJ05

ответ

2

Я наконец вернулся к этому проекту, и я также нашел решение своей проблемы.

Первый в этом разделе:

from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p") 
    select new TTMLElement 
    { 
     text = item, 
     startTime = TimeSpan.Parse(item.Attribute("begin").Value), 
     endTime = item.Attribute("dur") != null ? 
      TimeSpan.Parse(item.Attribute("begin").Value).Add(TimeSpan.Parse(item.Attribute("dur").Value)) : 
      TimeSpan.Parse(item.Attribute("end").Value) 
    } 

элемент типа XElement так объект XmlReader может быть создан из него в результате этой функции:

private static string ReadInnerXML(XElement parent) 
{ 
    var reader = parent.CreateReader(); 
    reader.MoveToContent(); 
    var innerText = reader.ReadInnerXml(); 
    return innerText; 
} 

Для моих целей удаления HTML внутри узел I изменил функцию следующим образом:

private static string ReadInnerXML(XElement parent) 
{ 
    var reader = parent.CreateReader(); 
    reader.MoveToContent(); 
    var innerText = reader.ReadInnerXml(); 
    innerText = Regex.Replace(innerText, "<.+?>", " "); 
    return innerText; 
} 

И наконец, результат в приведенной выше лямбде выглядит так:

from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p") 
    select new TTMLElement 
    { 
     text = ReadInnerXML(item), 
     startTime = TimeSpan.Parse(item.Attribute("begin").Value), 
     endTime = item.Attribute("dur") != null ? 
      TimeSpan.Parse(item.Attribute("begin").Value).Add(TimeSpan.Parse(item.Attribute("dur").Value)) : 
      TimeSpan.Parse(item.Attribute("end").Value) 
    } 
0

Microsoft есть инструмент, который генерирует в обоих форматах:

Это демо позволяет создавать простые видео файлы субтитров. Начните с загрузки видео в формате, который может воспроизводить ваш браузер. Затем поочередно воспроизводите и приостанавливайте видео, вводя подпись для каждого сегмента.

Если у вас есть сохраненный файл заголовка WebVTT или TTML для вашего видео, вы можете загрузить его, отредактировать текст существующих сегментов или добавить новые сегменты.

Если вы хотите сделать это программно, ответы на otherquestions может помочь.