多个srt文件合并

    技术2022-07-11  76

    多个srt文件合并

    多个字幕文件路径以list存放,每个字幕文件的内容都追加在第一个字幕文件之后,时长累加,字幕编号累加。 直接上代码 /** * 合并srt字幕文件 * @param srtPathList */ public void mergeSrt(List<String> srtPathList){ if (srtPathList != null && srtPathList.size() > 0){ FileOutputStream mergeFos = null; int maxNumber = 0; long maxTime = 0L; File firstSrtFile = new File(srtPathList.get(0)); try { InputStreamReader read = new InputStreamReader(new FileInputStream(firstSrtFile), "utf-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt; List<String> lineList = new ArrayList<>(); // 取得第一个文件的行号最大值和字幕时间最大值 while ((lineTxt = bufferedReader.readLine()) != null){ lineList.add(lineTxt); } if (lineList != null && lineList.size() > 4){ int size = lineList.size(); maxNumber = Integer.parseInt(lineList.get(size - 4)); String timeString = lineList.get(size - 3).split(" ")[2]; maxTime = ConvertUtil.convertToMs(timeString); } read.close(); bufferedReader.close(); mergeFos = new FileOutputStream(firstSrtFile, true); for (int i = 1; i < srtPathList.size(); i++){ InputStreamReader readI = new InputStreamReader(new FileInputStream(srtPathList.get(i)), "utf-8"); BufferedReader bufferedReaderI = new BufferedReader(readI); String lineTxtI; int lines = (int) Files.lines(Paths.get(srtPathList.get(i))).count(); int index = 0; while ((lineTxtI = bufferedReaderI.readLine()) != null){ index ++; switch (index % 4){ case 1 : lineTxtI = String.valueOf(Integer.parseInt(lineTxtI) + maxNumber); break; case 2 : String[] timeArray = lineTxtI.split(" --> "); long bg = Long.valueOf(ConvertUtil.convertToMs(timeArray[0])) + maxTime; long ed = Long.valueOf(ConvertUtil.convertToMs(timeArray[1])) + maxTime; lineTxtI = ConvertUtil.convertTime(bg) + " --> " + ConvertUtil.convertTime(ed); break; } // 取得新的行号最大值和字幕时间最大值 switch (lines - index){ case 3 : maxNumber = Integer.parseInt(lineTxtI); break; case 2 : String[] timeArray = lineTxtI.split(" --> "); maxTime = Long.valueOf(ConvertUtil.convertToMs(timeArray[1])); break; } lineTxtI += "\r\n"; mergeFos.write(lineTxtI.getBytes()); } bufferedReaderI.close(); readI.close(); // 删除已经被合并的字幕文件 File delFile = new File(srtPathList.get(i)); delFile.delete(); } mergeFos.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { mergeFos.close(); } catch (IOException e) { e.printStackTrace(); } } } 用到的工具类 public class ConvertUtil { /** * @Author: luyang2 * @Param: * @Description: 毫秒转换为HH:mm:ss,SSS * @Date: 2020/5/11 14:46 */ public static String convertTime (long ms){ SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss,SSS"); format.setTimeZone(TimeZone.getTimeZone("GMT+00:00")); return format.format(ms); } /** * @Author: luyang2 * @Param: * @Description: HH:mm:ss,SSS转换为毫秒 * @Date: 2020/6/24 14:37 */ public static long convertToMs (String timeString){ if (StringUtils.isBlank(timeString)){ return 0; } long maxTime; String[] timeStringArray = timeString.split(":"); if (timeStringArray.length < 3){ return 0; } int hour = Integer.parseInt(timeStringArray[0]); int minute = Integer.parseInt(timeStringArray[1]); int second = Integer.parseInt(timeStringArray[2].split(",")[0]); if (timeStringArray[2].split(",").length < 2){ maxTime = (hour * 3600 + minute * 60 + second) * 1000; return maxTime; } maxTime = (hour * 3600 + minute * 60 + second) * 1000 + Integer.parseInt(timeStringArray[2].split(",")[1]); return maxTime; } }
    Processed: 0.021, SQL: 9