1.定義一個(gè)實(shí)體類
用于解析srt文件的內(nèi)容
public class SRT {
private int beginTime;
private int endTime;
private String srtBody;
public int getBeginTime() {
return beginTime;
}
public void setBeginTime(int beginTime) {
this.beginTime = beginTime;
}
public int getEndTime() {
return endTime;
}
public void setEndTime(int endTime) {
this.endTime = endTime;
}
public String getSrtBody() {
return srtBody;
}
public void setSrtBody(String srtBody) {
this.srtBody = srtBody;
}
@Override
public String toString() {
return "" + beginTime + ":" + endTime + ":" + srtBody;
}
}
2.定義一個(gè)方法解析srt文件竭望,并存放在集合中
public class SrtParser {
public static int lastEndTime;
private static ArrayList<SRT> enSrtList;
private static String content;
/**
* 解析SRT字幕文件
* 字幕路徑
*/
public static void parseSrt(String name, ArrayList<SRT> srtList) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(name);
BufferedReader br = new BufferedReader(new InputStreamReader(
inputStream, "UTF-8"));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
if (!line.equals("")) {
sb.append(line).append("@");
continue;
}
String[] parseStrs = sb.toString().split("@");
// 該if為了適應(yīng)一開始就有空行以及其他不符格式的空行情況
if (parseStrs.length < 3) {
sb.delete(0, sb.length());// 清空邪码,否則影響下一個(gè)字幕元素的解析</i>
continue;
}
SRT srt = new SRT();
// 解析開始和結(jié)束時(shí)間
String timeTotime = parseStrs[1];
int begin_hour = Integer.parseInt(timeTotime.substring(0, 2));
int begin_mintue = Integer.parseInt(timeTotime.substring(3, 5));
int begin_scend = Integer.parseInt(timeTotime.substring(6, 8));
int beginTime = (begin_hour * 3600 + begin_mintue * 60 + begin_scend)
* 1000;
int end_hour = Integer.parseInt(timeTotime.substring(14, 16));
int end_mintue = Integer.parseInt(timeTotime.substring(17, 19));
int end_scend = Integer.parseInt(timeTotime.substring(20, 22));
int endTime = (end_hour * 3600 + end_mintue * 60 + end_scend)
* 1000;
//解析字幕文字
String srtBody = "";
// 可能1句字幕,也可能2句及以上咬清。
for (int i = 2; i < parseStrs.length; i++) {
srtBody += parseStrs[2] + "\n";
}
// 刪除最后一個(gè)"\n"
srtBody = srtBody.substring(0, srtBody.length() - 1);
// 設(shè)置SRT
srt.setBeginTime(beginTime);
srt.setEndTime(endTime);
srt.setSrtBody(srtBody);
srtList.add(srt);
sb.delete(0, sb.length());// 清空闭专,否則影響下一個(gè)字幕元素的解析
}
lastEndTime = srtList.get(srtList.size() - 1).getEndTime();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//顯示字幕(雙語顯示,如果只是單語顯示旧烧,不要 if (isGB2312(srtBody)) 這個(gè)判斷)
public static void showSRT(GiraffePlayer videoView, TextView tvSrtCN, TextView tvSrtEN, String s, ArrayList<SRT> srtList, int size) {
int currentPosition = videoView.getCurrentPosition();//vv是VideoView播放器
if (currentPosition > lastEndTime) {
tvSrtCN.setVisibility(View.GONE);
tvSrtEN.setVisibility(View.GONE);
}
for (int i = 0; i < srtList.size(); i++) {
SRT srtbean = srtList.get(i);
if (currentPosition >= srtbean.getBeginTime()
&& currentPosition <= srtbean.getEndTime()) {
String srtBody = srtbean.getSrtBody();
if (isGB2312(srtBody)) {
tvSrtCN.setVisibility(View.VISIBLE);
tvSrtCN.setText(srtBody);
Log.e("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", "中文");
} else {
tvSrtEN.setVisibility(View.VISIBLE);
tvSrtEN.setText(srtBody);
Log.e("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", "英文");
}
//顯示過的就刪掉喻圃,提高查詢效率
// srtList.remove(i);
// break;//找到后就沒必要繼續(xù)遍歷下去,節(jié)約資源
} else {
if (i < srtList.size() - 2 && currentPosition > srtbean.getEndTime() && currentPosition < srtList.get(i + 1).getBeginTime()) {
tvSrtCN.setVisibility(View.GONE);
tvSrtEN.setVisibility(View.GONE);
}
}
}
// }
}
public static Boolean isGB2312(String str) {
for (int i = 0; i < str.length(); i++) {
String bb = str.substring(i, i + 1);
// 生成一個(gè)Pattern,同時(shí)編譯一個(gè)正則表達(dá)式,其中的u4E00("一"的unicode編碼)-\u9FA5("龥"的unicode編碼)
boolean cc = java.util.regex.Pattern.matches("[\u4E00-\u9FA5]", bb);
if (cc == false) {
return cc;
}
}
return true;
}
3.下載srt文件
根據(jù)服務(wù)器提供的地址粪滤,下載srt字幕文件斧拍,存儲在本地,然后調(diào)用解析的方法杖小,顯示字幕肆汹,并且用Handler每個(gè)多少秒去遍歷集合顯示字幕
//下載的邏輯自己去處理
//本地存儲的路徑
String name = Environment.getExternalStorageDirectory().getPath() + "/" + srt;
//解析srt文件
SrtParser.parseSrt(name, srtList);
//發(fā)送Handler請求,每個(gè)5秒
mHandler.sendEmptyMessageDelayed(0, 500);
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case PARSE_SRT_CN:
SrtParser.showSRT(mGiraffePlayer, cn_subtitleview, en_subtitleview, "cn", srtList, size);
//每隔500ms執(zhí)行一次showSRT()
mHandler.sendEmptyMessageDelayed(0, 500);
}
}
};