android str 字幕文件,视频显示字幕(解析srt文件)
1.定义一个实体类
用于解析srt文件的内容
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.定义一个方法解析srt文件,并存放在集合中
public class SrtParser {
public static int lastEndTime;
private static ArrayList enSrtList;
private static String content;
/**
* 解析SRT字幕文件
* 字幕路径
*/
public static void parseSrt(String name, ArrayList 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为了适应一开始就有空行以及其他不符格式的空行情况
if (parseStrs.length < 3) {
sb.delete(0, sb.length());// 清空,否则影响下一个字幕元素的解析
continue;
}
SRT srt = new SRT();
// 解析开始和结束时间
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";
}
// 删除最后一个"\n"
srtBody = srtBody.substring(0, srtBody.length() - 1);
// 设置SRT
srt.setBeginTime(beginTime);
srt.setEndTime(endTime);
srt.setSrtBody(srtBody);
srtList.add(srt);
sb.delete(0, sb.length());// 清空,否则影响下一个字幕元素的解析
}
lastEndTime = srtList.get(srtList.size() - 1).getEndTime();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//显示字幕(双语显示,如果只是单语显示,不要 if (isGB2312(srtBody)) 这个判断)
public static void showSRT(GiraffePlayer videoView, TextView tvSrtCN, TextView tvSrtEN, String s, ArrayList 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;//找到后就没必要继续遍历下去,节约资源
} 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);
// 生成一个Pattern,同时编译一个正则表达式,其中的u4E00("一"的unicode编码)-\u9FA5("龥"的unicode编码)
boolean cc = java.util.regex.Pattern.matches("[\u4E00-\u9FA5]", bb);
if (cc == false) {
return cc;
}
}
return true;
}
3.下载srt文件
根据服务器提供的地址,下载srt字幕文件,存储在本地,然后调用解析的方法,显示字幕,并且用Handler每个多少秒去遍历集合显示字幕
//下载的逻辑自己去处理
//本地存储的路径
String name = Environment.getExternalStorageDirectory().getPath() + "/" + srt;
//解析srt文件
SrtParser.parseSrt(name, srtList);
//发送Handler请求,每个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执行一次showSRT()
mHandler.sendEmptyMessageDelayed(0, 500);
}
}
};
android str 字幕文件,视频显示字幕(解析srt文件)相关推荐
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )
文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...
- Android实例RSS客户端开发(2)--解析XML文件
一 介绍完RSS之后,下面开始讲解如何解析RSS文件.因为RSS是基于XML的,所以我们就直接介绍如何解析XML文件. 解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模 ...
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )
文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...
- java 解析xls 文件_java简单解析xls文件的方法示例【读取和写入】
本文实例讲述了java简单解析xls文件的方法.分享给大家供大家参考,具体如下: 读取: import java.io.*; import jxl.*; import jxl.write.*; imp ...
- 生成XML文件的步骤 解析XML文件
##生成XML文件的步骤 1.初始化一个xml的序列化器 XmlSerializer serializer = Xml.newSerializer(); 2.设置序列化器的参数 serializer. ...
- spark解析csv文件_Spark:解析CSV文件并按列值分组
spark解析csv文件 我发现自己经常使用大型CSV文件,并且意识到我现有的工具集不能让我快速浏览它们,我以为我会花一些时间在Spark上看看是否有帮助. 我正在使用芝加哥市发布的犯罪数据集 :它的 ...
- python读取svg文件_Python lxml解析svg文件
我试图从 http://kanjivg.tagaini.net/解析.svg文件,但我无法成功提取内部信息. 0f9ab.svg的一部分如下所示: 我的.py文件: import lxml.etree ...
- excel文件存入mysql_解析excel文件并将数据导入到数据库中
今天领导给安排了一个临时工作,让我将一个excel里面的数据解析后放入数据库中,经过一个下午的努力成功完成,现在将代码献上,希望对大家有所帮助 一.需要导入的jar 1.commons-collect ...
- vue从服务器获取csv文件,前端 VUE 解析 CSV 文件
测试文件及依赖下载 静态依赖 yarn包 yarn add jschardet -s yarn add papaparse -s 业务代码 template ref="upload" ...
最新文章
- Dom4j和Xpath(转)
- git ssh配置完后拉取代码_CentOS6自带git版本需要用户名才能拉取代码
- linux多线程求和_211渣硕,海投200+家Java岗(面40,过7),收获多份offer!
- 最终产品的质量需求是什么?
- Spring Roo 简介
- mysql判断是否在日期区间_通过sql判断时间区间是否存在数据
- foxitreadersdk 打开远程文件_一种最不为人知最简单最方便的用电脑操作手机上的文件...
- 260多媒体语言如何调节_260马力配9.7米货厢,实拍柳汽H5小三轴载货车
- java学到哪里最容易蒙,蒙哥比vs蒙克(目前最好的哪个)
- jsp中post提交和get提交乱码解决_统一请求编码
- MongoDB学习笔记(四)--索引 性能优化
- CentOS 配置httpd使局域网能够正常訪问
- Office 2007,在编辑Word时,文件经常无法保存会丢失
- 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
- 华为跨域bgp_跨域组播---BGP+MSDP
- 【potplayer安装及设置LAV Splitter】
- 计算机职称落户,2019有这些中级职称就可以在上海落户啦!(国家职业资格)
- 关于程序集成线上支付模块
- audio音频不能自动播放的解决方法
- VC++ WCHAR,CHAR,TCHAR的区别