Flutter XML转VTT字幕插件xmltovtt的使用

Flutter XML转VTT字幕插件xmltovtt的使用

XML转VTT字幕转换器

许可证
构建状态
发布状态
版本号
代码大小

这是一个用于将特定的XML字幕文件转换生成VTT文件的Dart控制台应用程序。

使用方法

示例文件位于data文件夹内,同时用于测试。

此命令会从指定文件夹内的所有XML文件生成VTT文件,默认情况下为当前文件夹。

  • 命令: xmltovtt -d <文件夹路径>
  • 示例:
    • xmltovtt: 在当前文件夹执行。
    • xmltovtt -d data: 在data文件夹执行。

工作原理

XML文件格式如下:

<xml>
  <dia>
    <st>15330</st>
    <et>15870</et>
    <sub><![CDATA[第一段字幕]]></sub>
    <style name="style" version="2">
      <position alignment="BottomCenter" horizontal-margin="50%" vertical-margin="86%" />
    </style>
  </dia>
  <dia>
    <st>49250</st>
    <et>51250</et>
    <sub><![CDATA[第二段字幕]]></sub>
    <style name="style" version="2">
      <position alignment="BottomCenter" horizontal-margin="50%" vertical-margin="86%" />
    </style>
  </dia>
</xml>
时间 XML 时间(ms) VTT 时间 描述
st: 开始时间 15330 00:00:15.330 转换自毫秒到小时:分钟:秒.毫秒(毫秒:毫秒)
et: 结束时间 15870 00:00:15.870 转换自毫秒到小时:分钟:秒.毫秒(毫秒:毫秒)
  • sub: 字幕标记为 <sub><![CDATA[** 第一段字幕 **]]></sub>

转换后的VTT文件格式如下:

WEBVTT

00:00:15.330 --> 0:00:15.870
看剑尖。

00:00:49.250 --> 0:00:51.250
保护你。

完整示例Demo

以下是一个完整的示例代码,演示如何使用该插件进行转换。

import 'dart:io' show Directory;

import 'package:xmltovtt/xmltovtt.dart' as app;

void main() {
  // 指定要转换文件的目录
  final dir = Directory('data');

  // 如果目录不存在,则退出并返回代码1
  app.checkDirExists(dir);
  app.start(dir);
}

更多关于Flutter XML转VTT字幕插件xmltovtt的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter XML转VTT字幕插件xmltovtt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用xmltovtt插件将XML格式的字幕转换为VTT(WebVTT)格式的字幕文件的示例代码。请注意,xmltovtt插件可能是一个假想的插件名称,因为在实际的Flutter生态系统中并没有一个直接名为xmltovtt的官方插件。不过,我们可以创建一个类似的自定义解决方案来实现这一功能。

为了实现这一功能,你需要做以下几步:

  1. 解析XML文件。
  2. 提取字幕信息。
  3. 生成VTT格式的字幕文件。

我们可以使用xml库来解析XML,然后手动生成VTT文件。以下是一个简单的示例代码:

首先,在pubspec.yaml文件中添加xml依赖:

dependencies:
  flutter:
    sdk: flutter
  xml: ^5.3.1  # 请检查最新版本号

然后,在你的Flutter项目中创建一个Dart文件(例如xml_to_vtt.dart),并添加以下代码:

import 'dart:convert';
import 'package:xml/xml.dart';
import 'dart:io';

class Subtitle {
  String startTime;
  String endTime;
  String text;

  Subtitle({required this.startTime, required this.endTime, required this.text});
}

List<Subtitle> parseXmlToSubtitles(String xmlString) {
  List<Subtitle> subtitles = [];

  XmlDocument doc = XmlDocument.parse(xmlString);
  XmlElement root = doc.rootElement;

  // 假设你的XML结构是这样的:<subtitles><subtitle start="00:00:01.000" end="00:00:03.000">Hello, World!</subtitle></subtitles>
  List<XmlElement> subtitleElements = root.findElements('subtitle');

  for (XmlElement element in subtitleElements) {
    String startTime = element.getAttribute('start') ?? '';
    String endTime = element.getAttribute('end') ?? '';
    String text = element.text.trim();

    subtitles.add(Subtitle(startTime: startTime, endTime: endTime, text: text));
  }

  return subtitles;
}

String generateVttFromSubtitles(List<Subtitle> subtitles) {
  StringBuffer vttBuffer = StringBuffer();

  vttBuffer.writeln('WEBVTT');

  for (Subtitle subtitle in subtitles) {
    vttBuffer.writeln('');
    vttBuffer.writeln('${int.parse(subtitle.startTime.split('.')[0].replaceAll(':', '').padLeft(8, '0'))} --> ${int.parse(subtitle.endTime.split('.')[0].replaceAll(':', '').padLeft(8, '0'))}');
    vttBuffer.writeln(subtitle.text);
  }

  return vttBuffer.toString();
}

Future<void> saveVttToFile(String vttContent, String filePath) async {
  File file = File(filePath);
  await file.writeAsString(vttContent);
}

void main() async {
  // 示例XML字符串
  String xmlString = '''
  <subtitles>
    <subtitle start="00:00:01.000" end="00:00:03.000">Hello, World!</subtitle>
    <subtitle start="00:00:04.000" end="00:00:06.000">This is a test.</subtitle>
  </subtitles>
  ''';

  // 解析XML到字幕列表
  List<Subtitle> subtitles = parseXmlToSubtitles(xmlString);

  // 生成VTT内容
  String vttContent = generateVttFromSubtitles(subtitles);

  // 保存VTT文件
  String filePath = 'subtitles.vtt';
  await saveVttToFile(vttContent, filePath);

  print('VTT文件已保存到 $filePath');
}

请注意,这个示例假设你的XML字幕文件具有特定的结构(即每个<subtitle>元素都有startend属性)。如果你的XML结构不同,你需要相应地调整parseXmlToSubtitles函数来正确解析你的XML文件。

此外,main函数是一个示例入口点,用于演示如何解析XML、生成VTT内容并保存到文件。在Flutter应用中,你可能需要在按钮点击或其他事件触发时调用这些函数。

由于Flutter主要用于构建用户界面,因此处理文件和I/O操作通常是在Flutter的compute函数、隔离区(Isolate)或原生平台代码(如Android的Java/Kotlin或iOS的Swift/Objective-C)中进行的,以避免阻塞UI线程。但是,对于简单的应用或开发阶段,上面的示例代码应该足够说明如何从XML转换到VTT。

回到顶部