一个修改电影字幕时间偏移的小程序

今天晚上看电影的时候在射手网上下载了一个字幕文件,看了一会儿就发觉字幕有点跟不上电影,差了两三秒钟吧,我想这应该是大家都遇到过的问题。怎么办呢,既然咱是程序员,那就动动手,发挥一下,于是花了20分钟写了这么个小程序,很简陋,但是记录下来,一方面为了做个记录,另一方面也为了能够帮到别人,如果你也有同样的需求,希望能节省一点你的时间吧

附上jar文件,使用方法 java -jar SrtTimelineChanger 字幕文件路径 调节的时间(以毫秒计算) 如: java -jar SrtTimelineChanger 1.srt -3000

只适用于.srt文件,或是时间方式为 HH:MM:SS,nnn ---> HH:MM:SS,nnn的字幕文件,编码为gbk

代码如下:

  1 /*
  2  * Copyright 2013
  3  *
  4  * Licensed under the Apache License, Version 2.0 (the "License");
  5  * you may not use this file except in compliance with the License.
  6  * You may obtain a copy of the License at
  7  *
  8  *     http://www.apache.org/licenses/LICENSE-2.0
  9  *
 10  * Unless required by applicable law or agreed to in writing, software
 11  * distributed under the License is distributed on an "AS IS" BASIS,
 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  * See the License for the specific language governing permissions and
 14  * limitations under the License.
 15  */
 16 
 17 package com.yueang.tools;
 18 
 19 import java.io.BufferedReader;
 20 import java.io.BufferedWriter;
 21 import java.io.File;
 22 import java.io.FileInputStream;
 23 import java.io.FileNotFoundException;
 24 import java.io.FileOutputStream;
 25 import java.io.IOException;
 26 import java.io.InputStreamReader;
 27 import java.io.OutputStreamWriter;
 28 import java.io.UnsupportedEncodingException;
 29 
 30 public class SrtTimelineChanger {
 31 
 32     public static void main(String[] args) {
 33 
 34         if (args.length != 2) {
 35             System.out.print("params wrong");
 36             return;
 37         }
 38 
 39         String filePath = args[0];
 40         int timeShift = Integer.parseInt(args[1]);
 41 
 42         SrtTimelineChanger changer = new SrtTimelineChanger();
 43         try {
 44             changer.change(filePath, timeShift);
 45         } catch (UnsupportedEncodingException e) {
 46             // TODO Auto-generated catch block
 47             e.printStackTrace();
 48         } catch (FileNotFoundException e) {
 49             // TODO Auto-generated catch block
 50             e.printStackTrace();
 51         } catch (IOException e) {
 52             // TODO Auto-generated catch block
 53             e.printStackTrace();
 54         }
 55 
 56         System.out.print("Exit");
 57     }
 58 
 59     private void change(String filePath, int timeShift) throws IOException {
 60         File file = new File(filePath);
 61 
 62         StringBuilder sb = new StringBuilder();
 63         BufferedReader reader = new BufferedReader(new InputStreamReader(
 64                 new FileInputStream(file), "gbk"));
 65         String line = reader.readLine();
 66         while (line != null) {
 67             sb.append(changeLine(line, timeShift));
 68             sb.append("\r\n");
 69             line = reader.readLine();
 70         }
 71 
 72         reader.close();
 73         File outFile = new File(filePath + ".out");
 74         if (outFile.exists()) {
 75             outFile.delete();
 76         }
 77         outFile.createNewFile();
 78         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
 79                 new FileOutputStream(outFile), "gbk"));
 80         writer.write(sb.toString());
 81         writer.flush();
 82         writer.close();
 83     }
 84 
 85     private Object changeLine(String line, int timeShift) {
 86         if (line.matches("^\\d\\d:\\d\\d:\\d\\d,\\d\\d\\d.*\\d\\d:\\d\\d:\\d\\d,\\d\\d\\d$")) {
 87             int start = calculate(line.substring(0, 12));
 88             int end = calculate(line.substring(17, 29));
 89 
 90             StringBuilder sb = new StringBuilder();
 91             sb.append(expand(start + timeShift));
 92             sb.append(" --> ");
 93             sb.append(expand(end + timeShift));
 94 
 95             System.out.println(line);
 96             System.out.println(sb.toString());
 97 
 98             return sb.toString();
 99         }
100 
101         return line;
102     }
103 
104     private String expand(long l) {
105         int hour = (int) (l / 3600000);
106         int min = (int) ((l - hour * 3600000) / 60000);
107         int sec = (int) ((l - hour * 3600000 - min * 60000) / 1000);
108         int mili = (int) (l - hour * 3600000 - min * 60000 - sec * 1000);
109 
110         return String.format("%02d:%02d:%02d,%03d", hour, min, sec, mili);
111     }
112 
113     private int calculate(String time) {
114         int hour = Integer.parseInt(time.substring(0, 2));
115         int min = Integer.parseInt(time.substring(3, 5));
116         int sec = Integer.parseInt(time.substring(6, 8));
117         int mili = Integer.parseInt(time.substring(9, 12));
118 
119         return mili + sec * 1000 + min * 60000 + hour * 3600000;
120     }
121 }

 

posted @ 2013-06-01 22:16  岳昂  阅读(1320)  评论(1编辑  收藏  举报