c#读取srt字幕文件

在WPF项目中,使用MediaElement实现了一个视频播放器的功能,但是需要实现显示字幕的功能,在网上查看了一些资料之后,算是实现的基本的显示功能。

分析

1.srt字幕文件格式:

srt字幕文件的格式是:
1
00:00:02,580 –> 00:00:05,980
This is from Gagarin.

2
00:00:11,260 –> 00:00:15,760
This is from Gagarin.

3
00:00:18,660 –> 00:00:22,660
初次发帖,欢迎分享.

4
00:00:23,860 –> 00:00:30,860
Trust is like a piece of paper. When it creases, it cannot recover even it is smoothed.
信任就像一张纸,皱了,即使抚平,也恢复不了原样了。

即:
数字
时间 –> 时间
字幕内容(可以多行)
空行
数字
时间 –> 时间
字幕内容(可以多行)
空行

2.读取srt字幕文件格式:

可以发现所有内容都是一个个:
[数字
时间 –> 时间
字幕内容(可以多行)]
的模型,所以:
我们可以生成一个这样的model,将所有的model添加到集合中。

 //定义一个StrModel的类,用于接受从srt文件读取的文件格式public class SrtModel{private int beginTime;private int endTime;private string srtString;private int index;public int BeginTime { get => beginTime; set => beginTime = value; }public int EndTime { get => endTime; set => endTime = value; }public string SrtString { get => srtString; set => srtString = value; }public int Index { get => index; set => index = value; }}
  //解析字幕文件public class SrtHelper{//定义一个ModelList的列表用于接受从文件读取的内容private static List<SrtModel> mySrtModelList;//定义一个获取当前时间显示的string的方法public static string GetTimeString(int timeMile){String currentTimeTxt = "";if (mySrtModelList != null){foreach (SrtModel sm in mySrtModelList){if (timeMile > sm.BeginTime && timeMile < sm.EndTime){currentTimeTxt = sm.SrtString;}}}return currentTimeTxt;}//读取文件中的内容到mySrtModelList列表public static List<SrtModel> ParseSrt(string srtPath){mySrtModelList = new List<SrtModel>();string line;using (FileStream fs = new FileStream(srtPath, FileMode.Open)){using (StreamReader sr = new StreamReader(fs,Encoding.Default)){StringBuilder sb = new StringBuilder();while ((line = sr.ReadLine()) != null){if (!line.Equals("")){sb.Append(line).Append("@");continue;}string[] parseStrs = sb.ToString().Split('@');if (parseStrs.Length < 3){sb.Remove(0, sb.Length);// 清空,否则影响下一个字幕元素的解析</i>  continue;}SrtModel srt = new SrtModel();string strToTime = parseStrs[1];int beginHour = int.Parse(strToTime.Substring(0, 2));int begin_mintue = int.Parse(strToTime.Substring(3, 2));int begin_scend = int.Parse(strToTime.Substring(6, 2));int begin_milli = int.Parse(strToTime.Substring(9, 3));int beginTime = (beginHour * 3600 + begin_mintue * 60 + begin_scend) * 1000 + begin_milli;int end_hour = int.Parse(strToTime.Substring(17, 2));int end_mintue = int.Parse(strToTime.Substring(20, 2));int end_scend = int.Parse(strToTime.Substring(23, 2));int end_milli = int.Parse(strToTime.Substring(26, 2));int endTime = (end_hour * 3600 + end_mintue * 60 + end_scend) * 1000 + end_milli;srt.BeginTime = beginTime;srt.EndTime = endTime;string strBody = null;for (int i = 2; i < parseStrs.Length; i++){strBody += parseStrs[i];}srt.SrtString = strBody;mySrtModelList.Add(srt);sb.Remove(0, sb.Length);}}}return mySrtModelList;}

3.视频中显示字幕:

3.1先根据文件路径,读取字幕文件:
List srtModel=SrtHelper.ParseSrt(str);//str为文件路径
3.1根据视频时间计算相应值,遍历srtModel取出与之对应的字符串

//currentPositionTimeSpan视频当前位置int timeMiles = (int)currentPositionTimeSpan.TotalHours * 3600 + (int)currentPositionTimeSpan.TotalMinutes * 60 + (int)currentPositionTimeSpan.TotalSeconds * 1000;//获取字符串string timeString = SrtHelper.GetTimeString(timeMiles);//lyrics为当前显示文本容器lyrics.Text = timeString;

上面代码利用计时器,定时触发。

C#读取srt字幕格式文件显示字幕相关推荐

  1. 使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本

    使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本 文章目录 使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本 前言: 背景 tm ...

  2. pyqt5:python读取二进制文件(音频PCM文件)显示波形

    文章目录 1.使用ffmpeg生成PCM文件 1.1 用 ffprobe 查看文件信息 1.2 用 ffmpeg 命令转换 1.3 用ffplay 测试播放PCM文件 2.python读取PCM文件显 ...

  3. sex 无需下载_js读取本地json格式文件数据的几种实现方法,内有vue读取json示例代码。...

    方法一:通过getJSON实现 getJSON是jquery提供的读取json格式文件的方法 首先我们将html中引入jquery,可以通过百度CDN引入,代码如下: 然后就可以在script中使用g ...

  4. 使用Python读取LabVIEW TDMS 格式文件转成 pandas及Excel

    个人用Django开发的博客已上线,欢迎访问:https://www.zhibibin.com Labview的TMDS格式文件在很多偏硬件相关的工作中经常出现,有时候面临将TDMS转成Excel通用 ...

  5. php读取本地xlsx格式文件的数据并按json格式返回

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 目的:php读取并操作本地xlsx格式的文件: 完整示例代码: 代码讲解:前端发起post网络请求,php接收 ...

  6. matlab打开dat形式文件_matlab的各种数据读取(txtdatmat等格式)文件打开关闭

    matlab 的各种数据读取( txt , dat , mat 等格式) ,文件打开 关闭 MATLAB 提供了多种方式从磁盘读入文件或将数据输 入到工作空间,即读取数据,又叫导入数据:将工作空间的 ...

  7. Python编程之读取Excel csv格式文件内容

    1.读取csv文件,返回list数据结构 注意:csv文件中不应该出现合并行的数据,否则读取为空值 test.csv文件为:可以自己定义 2.程序部分 import sys import csv de ...

  8. bam文件读取_SAM/BAM 格式文件内容解析

    一.首先需要知道以下几个知识点: 1.1-based coordinate system A coordinate system where the rst base of a sequence is ...

  9. vtt字幕格式转srt格式 [python]

    工欲善其事:: srt字幕格式,每个字幕段有四部分构成: 字幕序号 字幕显示的起始时间 字幕内容(可多行) 空白行(表示本字幕段的结束) vtt字幕格式: WEBVTT Kind: captions ...

  10. 使用Python对xlsx,csv, txt格式文件进行读、写并绘图

    0. 背景 最近需要用到python通过读取,写入Excel数据,并画一些图.虽然以前学过一些,但是都忘得差不多了,故翻出以前学习的资料,整理在此,常用常新,也方便自己以后复习. 1. 通过panda ...

最新文章

  1. inux 软件编译、安装、删除
  2. typedef的四个用途和两大陷阱
  3. mybatis多表分页
  4. [day17]appium之元素的定位
  5. 漂浮窗口拖动杂谈(续)
  6. linux设置多语言环境,怎么为Linux系统配置多语言环境?
  7. 【LeetCode】4月2日打卡-Day18-矩阵操作
  8. PowerEdge服务器生命周期控制器:Lifecycle Controller
  9. python-函数-默认值传参
  10. 秒速五厘米男主php,秒速五厘米最后男主从事的是什么工作?
  11. 大数据日志分析项目架构
  12. Facebook究竟是怎么抄袭Snapchat的?听听他们自己怎么说
  13. python123词频统计之哈姆雷特_基于Yarn的Spark环境,统计哈姆雷特词频(1)-阿里云开发者社区...
  14. php获取字段中的第几个数字_php提取字符串中的数字
  15. php 美化注册界面,美化,从登录界面背景开始
  16. 想做赴日软件工程师,为公为私
  17. 企业微信sdk调用流程
  18. .Microsoft Visual Studio 2010 Service Pack 1
  19. 《仿大众点评仿美团做一个评价网站——Java SSM》项目研发阶段性总结
  20. ubuntu16.04调整屏幕分辨率

热门文章

  1. 异常:could not initialize proxy - the owning Session
  2. CodeLite13避免中文乱码的方法
  3. MIT人工智能实验室:如何做研究
  4. 2018年总——不忘初心
  5. 蓝桥:8皇后·改(⼋皇后问题)
  6. python wilcoxon test_自动化框架之 python+selenium+pytest · TesterHome
  7. 产品读书.心理学《梦的解析》
  8. iOS开发基础-序列帧动画之Tom猫
  9. 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)
  10. 家用无线路由器WDS初始化失败解决方法