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文件)相关推荐

  1. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )

    文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...

  2. Android实例RSS客户端开发(2)--解析XML文件

    一 介绍完RSS之后,下面开始讲解如何解析RSS文件.因为RSS是基于XML的,所以我们就直接介绍如何解析XML文件. 解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模 ...

  3. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

    文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...

  4. java 解析xls 文件_java简单解析xls文件的方法示例【读取和写入】

    本文实例讲述了java简单解析xls文件的方法.分享给大家供大家参考,具体如下: 读取: import java.io.*; import jxl.*; import jxl.write.*; imp ...

  5. 生成XML文件的步骤 解析XML文件

    ##生成XML文件的步骤 1.初始化一个xml的序列化器 XmlSerializer serializer = Xml.newSerializer(); 2.设置序列化器的参数 serializer. ...

  6. spark解析csv文件_Spark:解析CSV文件并按列值分组

    spark解析csv文件 我发现自己经常使用大型CSV文件,并且意识到我现有的工具集不能让我快速浏览它们,我以为我会花一些时间在Spark上看看是否有帮助. 我正在使用芝加哥市发布的犯罪数据集 :它的 ...

  7. python读取svg文件_Python lxml解析svg文件

    我试图从 http://kanjivg.tagaini.net/解析.svg文件,但我无法成功提取内部信息. 0f9ab.svg的一部分如下所示: 我的.py文件: import lxml.etree ...

  8. excel文件存入mysql_解析excel文件并将数据导入到数据库中

    今天领导给安排了一个临时工作,让我将一个excel里面的数据解析后放入数据库中,经过一个下午的努力成功完成,现在将代码献上,希望对大家有所帮助 一.需要导入的jar 1.commons-collect ...

  9. vue从服务器获取csv文件,前端 VUE 解析 CSV 文件

    测试文件及依赖下载 静态依赖 yarn包 yarn add jschardet -s yarn add papaparse -s 业务代码 template ref="upload" ...

最新文章

  1. Dom4j和Xpath(转)
  2. git ssh配置完后拉取代码_CentOS6自带git版本需要用户名才能拉取代码
  3. linux多线程求和_211渣硕,海投200+家Java岗(面40,过7),收获多份offer!
  4. 最终产品的质量需求是什么?
  5. Spring Roo 简介
  6. mysql判断是否在日期区间_通过sql判断时间区间是否存在数据
  7. foxitreadersdk 打开远程文件_一种最不为人知最简单最方便的用电脑操作手机上的文件...
  8. 260多媒体语言如何调节_260马力配9.7米货厢,实拍柳汽H5小三轴载货车
  9. java学到哪里最容易蒙,蒙哥比vs蒙克(目前最好的哪个)
  10. jsp中post提交和get提交乱码解决_统一请求编码
  11. MongoDB学习笔记(四)--索引 性能优化
  12. CentOS 配置httpd使局域网能够正常訪问
  13. Office 2007,在编辑Word时,文件经常无法保存会丢失
  14. 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
  15. 华为跨域bgp_跨域组播---BGP+MSDP
  16. 【potplayer安装及设置LAV Splitter】
  17. 计算机职称落户,2019有这些中级职称就可以在上海落户啦!(国家职业资格)
  18. 关于程序集成线上支付模块
  19. audio音频不能自动播放的解决方法
  20. VC++ WCHAR,CHAR,TCHAR的区别

热门文章

  1. 【入门】已知一个圆的半径,求解该圆的面积和周长
  2. Java基础(数组)对象数组、有条件找出最大值对象
  3. 落单的数(落单的数 落单的数 II 落单的数 III)
  4. android studio 配置HTTP proxy
  5. Intellij IDEA 占满CPU
  6. B站年度产品榜 | 10项行业品类全面透析Z世代消费偏好
  7. 微博社交圈子挖掘所面临的困难
  8. 从零开始学版图(一)——反相器版图
  9. 用java获取一维数组的平均值_java中一维数组常见运算
  10. springboot整合websocket实现消息推送