问题
最近要搞在线视频播放,然后,逛了一圈,vuejs的视频播放器都只支持webvtt格式,webvtt格式是srt格式的扩展,也是html5的标准视频字幕格式。但是客户只有srt字幕文件,这里就必须解决srt字幕文件转vtt字幕文件的问题。
思路
主要使用noophq/subtitle的第三方库来进行字幕格式转换。使用Apache Commons IO库来解决UTF-8 BOM的字符串解析的问题(因为noophd的字幕库无法直接转化UTF-8 BOM格式的文件)。
解决
Maven
<properties>
<subtitle.version>0.9.0</subtitle.version>
<commons-io.version>2.4</commons-io.version>
</properties>
<dependencies>
<dependency>
<groupId>fr.noop</groupId>
<artifactId>subtitle</artifactId>
<version>${subtitle.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
</dependencies>
Java
import fr.noop.subtitle.model.SubtitleParsingException;
import fr.noop.subtitle.srt.SrtObject;
import fr.noop.subtitle.srt.SrtParser;
import fr.noop.subtitle.vtt.VttWriter;
import org.apache.commons.io.input.BOMInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SubtitleUtil {
public static void srt2vtt(File srtFile, File vttFile, Charset charset, ByteOrderMark byteOrderMark) {
BOMInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new BOMInputStream(new FileInputStream(srtFile), byteOrderMark);
SrtParser parser = new SrtParser(charset.name());
SrtObject subtitle = parser.parse(fileInputStream);
VttWriter writer = new VttWriter(charset.name());
fileOutputStream = new FileOutputStream(vttFile);
writer.write(subtitle, fileOutputStream);
} catch (IOException | SubtitleParsingException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}