2013-01-02 50 views
1

我工作的Web應用程序可以採用時間文本標記(TTML)或WebVTT格式獲取字幕文件。如果文件是定時文本,我想將它翻譯成WebVTT。這大多不是問題,我遇到的一個問題是,如果TTML將HTML作爲文本內容的一部分,那麼HTML標記將被丟棄。解析用於將時間文本標記轉換爲WebVTT的XML

例如:

<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(); 
} 

對我失去了我,或者有什麼想法有剛這樣做的更好方式,或者即使已經有將時間文本轉換爲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) 
    } 

產品是如此的XmlReader對象可以從它得到的在這個函數中創建類型的XElement的:

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; 
} 

最終得到的結果在上面的lambda看起來像這樣:

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

微軟有一個工具,它產生兩種格式:

此演示,讓您創建簡單的字幕的影片檔案。首先以瀏覽器可以播放的格式加載視頻。然後交替播放和暫停視頻,爲每個片段輸入標題。

如果您已爲視頻保存了WebVTT或TTML字幕文件,則可以加載它,編輯現有段的文本或附加新段。

如果要以編程方式執行此操作,可以使用otherquestions的答案。