首页 > 编程语言 >C#读取SRT字幕文件

C#读取SRT字幕文件

时间:2022-08-31 08:45:40浏览次数:50  
标签:Parse string C# Substring strToTime int 字幕 SRT using

之前自己做了一个小的播放器软件,缺少字幕的功能有时候很不方面,研究了一下,把SRT字幕的功能加上了。

SRT本身其实就是一个纯文本文件,只需要按照他的规则去解析就可以了。

附上我的实现代码,供大家参考:

using JcPlayer.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JcPlayer.Helpers
{
    /// <summary>
    /// 解析字幕文件
    /// </summary>
    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;
        }

        /// <summary>
        /// 读取文件中的内容到mySrtModelList列表
        /// </summary>
        /// <param name="srtPath">srt文件路径</param>
        /// <returns></returns>
        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;
        }
    }
}

代码中用到的数据类:

namespace JcPlayer.Models
{
    /// <summary>
    /// 定义一个StrModel的类,用于接受从srt文件读取的文件格式
    /// </summary>
    public class SrtModel
    {
        public int BeginTime { get; set; }
        public int EndTime { get; set; }
        public string SrtString { get; set; }
        public int Index { get; set; }
    }
}

 

标签:Parse,string,C#,Substring,strToTime,int,字幕,SRT,using
From: https://www.cnblogs.com/wzwyc/p/16641676.html

相关文章

  • SQL中 decode() 函数介绍
     SQL中decode()函数介绍decode()函数的语法:1Selectdecode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)23Fromtalbename45Where…其中:colum......
  • 使用 Apollo Server 和 Koa 合并 GraphQL Schema
    使用ApolloServer和Koa合并GraphQLSchema今天,在我们现代的开发者世界中,完全无法想象没有React、NodeJS、GraphQL等技术的生活。他们拥有稳固的队伍,并在数据交......
  • JavaScript 中的全局变量解释
    JavaScript中的全局变量解释****全局变量被定义在函数之外或在整个程序中使用的窗口对象旁边(除非被本地人遮蔽)。即使您声明一个变量而不使用var,它仍然会被解释为全局......
  • 函数,JavaScript 的核心。
    函数,JavaScript的核心。我听说函数被称为“心,”“灵魂,“和”国王”的JavaScript。他们试图强调JavaScript函数的重要性。让我们试着理解为什么函数对JavaSc......
  • 单击 [React] 启动组件
    单击[React]启动组件Photoby劳塔罗·安德里亚尼on不飞溅创建我的投资组合网站我想知道如何为移动响应创建一个抽屉。那时创建模态的想法出现了,但出现了另一个......
  • 使用 JavaScript Map Method 组合 mongo 查询的算法
    使用JavaScriptMapMethod组合mongo查询的算法假设您有大量数据,并且您想查找选定品牌的特定产品,例如尼卡化妆品和一个特定的类别,例如润唇膏从中。你的代码看起来......
  • linux查看日志文件内容命令tail、cat、tac、head、echo
    linux查看日志文件内容命令tail、cat、tac、head、echo-大自然的流风-博客园 https://www.cnblogs.com/zdz8207/p/linux-log-tail-cat-tac.htmllinux查看日志文件内......
  • 使用 pd.cut 将数值数据转换为 EDA 的分类数据
    使用pd.cut将数值数据转换为EDA的分类数据Photoby由Illyes设计on不飞溅在某些情况下,我们需要在探索性数据分析(EDA)的预处理中将数值数据转换为分类数据......
  • centos6.6 64 位安装 tomcat 8
    centos6.664位安装tomcat8-江边望海的个人页面-OSCHINA-中文开源技术交流社区 https://my.oschina.net/jiangbianwanghai/blog/472837安装说明虚拟机:Virtua......
  • linux scp从一台机器复制文件到另一台linux机器上去
    本机IP:192.168.138.150要传送的IP地址为:192.168.138.151任务:拷贝/etc/ha.d/ldirectord.cf文件到151机器上,地址为:/etc/ha.d在本机上操作,使用命令scp:以下操作是从本地拷......