多个srt文件合并

多个srt文件合并

  1. 多个字幕文件路径以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();
            }

        }


    }
  1. 用到的工具类
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值