本文主要讲解srt字幕文件的加载和格式解析,使用c++解析srt为我们需要的表达形式和格式。

1、srt格式文件为视频字幕文件,其格式为:

数字
时间 --> 时间
字幕内容(可以多行)
空行
数字
时间 --> 时间
字幕内容(可以多行)
空行

例子:

1
00:00:00,162 --> 00:00:01,875
This story is inspired by real events
in France in the late 19th century.

2
00:00:02,800 --> 00:00:03,000
<b>previously, on amc's "Feed the beast...</b>

3
00:00:06,560 --> 00:00:11,520
{\an4}{\pos(57.12,210.56)}翻譯:肉松 小酸奶 圈圈 Silence

4
00:00:11,560 --> 00:00:15,760
<b><u><font color='RED'>{\an4}{\pos(70,211.2)}文本</font></u></b>
<b><u><font color='RED'>文本</font></u></b>
<b><u><font color='RED'>文本</font></u></b>
<b><u><font color='RED'>文本</font></u></b>


2、解析

根据每个字幕段所包含的内容定义结构体:

struct sSubRipText
{int order;               //序号CString szStart;         //开始时间CString szEnd;           //结束时间CString szText;          //内容/*DWORD   dwTextColor;    //可用来存储解析字幕格式int     nAlignment;int      fontSize;CString        strFontName;*/sSubRipText(){order = 0;//dwTextColor = 0xffffff;szStart.Empty();szEnd.Empty();szText.Empty();}
};

定义结构体数组:

typedef CArray<sSubRipText,sSubRipText&> CArraySrt;

我的思路是:读取srt字幕文本文件,逐行读取,存到一个字符串数组中,每当遇到空行时,解析这一段字符串,清空字符串数组,直到读取到文本末尾。
读取文件代码为:

BOOL CSubtitleOperate::LoadSrt(LPCTSTR lpFilepath,CArrayScene& arrScene)
{arrScene.RemoveAll();CString filePath(lpFilepath);if (!IsFileExist(filePath))return FALSE;CString lineCurText,lineNextText;CStdioFileEx file;if(!file.Open(filePath,CFile::modeRead|CFile::shareDenyRead| CFile::typeText))return FALSE;int nPos = -1;BOOL bStop= TRUE;CArraySrt    arrSrt;CStringArray strArray;strArray.RemoveAll();while(bStop){bStop =file.ReadString(lineCurText);if (!bStop){if(strArray.GetCount()>0){ParseOneSrt(arrSrt,strArray);strArray.RemoveAll();}break;}if(!lineCurText.IsEmpty()){strArray.Add(lineCurText);}else{ParseOneSrt(arrSrt,strArray);strArray.RemoveAll();}}SrtToScene(arrScene,arrSrt);file.Close();return TRUE;
}

把每一个字幕当成一个字幕段,首先解析一个字幕段:

void CSubtitleOperate::ParseOneSrt(CArraySrt& arrSrt,CStringArray& strArray)
{int nCount = strArray.GetCount();if(nCount == 0)return;int nline = 0;                    //用来计数当前解析到第几行sSubRipText srtItem;if(IsDigit(strArray.GetAt(nline))){srtItem.order = _ttoi(strArray.GetAt(0));nline++;}if(nline+1>nCount)return;CString strTime = strArray.GetAt(nline);int npos = strTime.Find(_T("-->"));if(npos != -1){srtItem.szStart = strTime.Left(npos-1);       //将-->之前的字符串存在开始时间中,之后的放在结束时间中srtItem.szEnd = strTime.Mid(npos+4);                 nline++;}if(nCount>nline)                                     //多次判断是为了没有字符串而导致getAt错误{srtItem.szText = strArray.GetAt(nline);nline++;}for(int i = nline; i<nCount;i++){srtItem.szText += _T("\r\n") + strArray.GetAt(i); }ParseSrtFormat(srtItem);arrSrt.Add(srtItem);
}

解析每一段字幕格式:

void  CSubtitleOperate::ParseSrtFormat(sSubRipText& srtItem)
{CString strText = srtItem.szText;if(strText.IsEmpty())return;int nStart = 0;int npos1 = strText.Find('<',nStart);int npos2 = strText.Find('>',nStart);while(-1 != npos1 && -1 != npos2){if(strText.Delete(npos1,npos2-npos1+1)<=0)break;npos1 = strText.Find('<',nStart);npos2 = strText.Find('>',nStart);}npos1 = strText.Find('{',nStart);npos2 = strText.Find('}',nStart);while(-1 != npos1 && -1 != npos2){if(strText.Delete(npos1,npos2-npos1+1)<=0)break;npos1 = strText.Find('{',nStart);npos2 = strText.Find('}',nStart);}srtItem.szText = strText;
}

解析格式时由于我不需要字幕本身的格式,所以我直接去掉了,如果需要,可以了解srt字幕文件的格式方式解析字幕所附带的格式控制符号。

在此,srt字幕的解析就完啦,以上全属本人见解,如有什么不对的地方可以私信我告诉我哦~

srt字幕解析(上)相关推荐

  1. 公网传输技术之SRT协议解析(上)

     点击上方"LiveVideoStack"关注我们 作者:张博力 编辑:Alex ▼扫描下图二维码或点击阅读原文▼ 了解音视频技术大会更多信息 " 摘  要:SRT协议( ...

  2. Android——SRT字幕文件的下载、解压、转换、显示

    SRT字幕文件的下载.解压.显示 简介 下载 创建文件夹 文件下载 下载调用以及文件解析调用 解析 ZIP文件解析 外部引用 转换 转换SRT字幕文件 获取SRT文件list实体数据 显示 字幕显示 ...

  3. 使用 shell 脚本拼接 srt 字幕文件 (srtcat)

    背景 前段时间迷上了做 B 站视频,主要是摩托车方面的知识分享.做的也比较粗糙,就是几张图片配上语音和字幕进行解说.尝试过自己解说,发现录制视频对节奏的要求还是比较高的,这里面水太深把握不住.好在以 ...

  4. python-视频声音根据语音识别自动转为带时间的srt字幕文件

    文章目录 问题 解决 截图 srt格式原理 识别语音的讯飞接口调用函数 处理结果,得到字符 列表合成字典 问题 讯飞文字转写长语音只有5h免费,想要体验50000分钟白嫖的,看我另一篇文章 最近在看一 ...

  5. 【Python文本处理】基于运动路线记录GPX文件的基础运动速度求解,并转为SRT字幕格式(不需要安装三方库)

    [Python文本处理]基于运动路线记录GPX文件的基础运动速度求解,并转为SRT字幕格式(不需要安装三方库) 解析 GPX文件格式 GPX文件本身其实就是坐标.海拔.时间.心率等综合性的xml文件 ...

  6. srt编辑的文件在linux显示乱码,解决看本地视频srt字幕乱码问题教程-srt文件

    大家好,我是Ysaku,今天给大家带来一个解决srt字幕乱码问题的教程,今天在做视频的时候发现下载的视频配上srt字幕后显示的字幕会出现乱码情况,在修正问题后,我想大家也会也到这样的情况,那正好今天分 ...

  7. caption里面能不能加字体颜色的设置_短视频快速加SRT字幕这事 有几条Pr避坑指南请查收...

    最近短视频挺火,特别是微信开始进行"视频号"测试以来,短视频更是很多人挂在嘴边的话题. 窝在家里的这段时间,"假装是极客"也在刻苦钻研视频方面的"新技 ...

  8. srt字幕怎么导入视频 (视频字幕合并教程)

    不知道怎么将srt字幕怎么导入视频?来看下这个简单的教程吧! 第一步: 首先,下载安装4K Video Downloader软件到你的电脑上,然后运行它. 第二步: 打开软件,然后选择"转换 ...

  9. 编辑SRT字幕,添加在视频中播放

    最近很多人觉得在视频编辑SRT字幕很难剪辑,这里给大家分享一个简单的剪辑方法,一起来看如何批量剪辑在视频画面添加SRT字幕的操作步骤吧. 准备工具: 在电脑上安装一个媒体梦工厂 多个视频素材 开始操作 ...

最新文章

  1. java ajax 404_java – 在jQuery AJAX中调用Spring控制器时发现404错误
  2. 剑指offer.机器人的运动范围
  3. 17 redis -key设计原则
  4. Android字符串资源及其格式化
  5. r语言中对向量求条件语句_R中的条件语句
  6. 幕享 for Mac(全平台全设备投屏共享软件)中文版
  7. Cookie的格式及组成
  8. 新版IAR软件打开旧版本创建的项目时出现的三个错误及其解决方案 is too long for segment definition
  9. C# 二维码生成代码
  10. 如何成为深度学习工程师
  11. 网站漏洞修复公司 对网站上传文件漏洞的修复与安全加固
  12. 【MQTT学习】lesson8. :Retained 消息和 LWT
  13. 用Python写的水仙花数程序,感觉这个也比较好懂
  14. Android调取拍照和获取拍照后的照片
  15. 一键备份Android系统(软件)
  16. Apache构建虚拟主机
  17. servlet part对象文件上传
  18. linux查看以i开头的文件,Linux文件查找Day.13
  19. 新的vue项目-qq音乐网页版
  20. idea中@SpringBootApplication报红

热门文章

  1. 引进软件国际标准,培养高级软件人才
  2. 什么叫电阻和电阻率?什么叫电导和电导率?
  3. 艾提拉近年来技术大总结
  4. 【Go】Go语言视频零基础入门到精通项目实战web-基础篇
  5. StarUML for Mac的安装与破解
  6. 2006年全球顶级杀毒软件排名 BitDefender居首
  7. 哈夫曼解压缩解压缩学习
  8. extjs 资源库云平台 2013.7.21--邮编区号查询
  9. 5个有用的 CSS 布局生成器
  10. Android Gallery2 开发经验整理