解析XML转换时间文本标记到WebVTT
本文关键字:WebVTT 文本 XML 转换 时间 解析 | 更新日期: 2023-09-27 17:50:21
我正在开发一个web应用程序,它可以采用时间文本标记(TTML)或WebVTT格式的字幕文件。如果文件是定时文本,我想把它翻译成WebVTT。这基本上不是问题,我遇到的一个问题是,如果TTML有HTML作为文本内容的一部分,那么HTML标签就会被删除。
例如:<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的解决方案,我将不胜感激。谢谢。
我终于回到这个项目,我也找到了解决我的问题的方法。
本节第一部分:
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)
}
item是XElement类型的,因此可以从它创建XmlReader对象,从而产生以下函数:
private static string ReadInnerXML(XElement parent)
{
var reader = parent.CreateReader();
reader.MoveToContent();
var innerText = reader.ReadInnerXml();
return innerText;
}
为了删除节点内的html,我将函数修改为如下所示:
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)
}
微软有一个工具可以生成这两种格式:
- HTML5视频字幕制作
这个演示允许您创建简单的视频标题文件。首先以浏览器可以播放的格式加载视频。然后交替播放和暂停视频,为每个片段输入字幕。
如果你有一个保存的WebVTT或TTML标题文件为您的视频,你可以加载它,编辑现有的部分的文本,或追加新的部分。
如果你想用编程的方式来做,回答其他问题可能会有帮助。