srt字幕解析(上)
本文主要讲解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字幕解析(上)相关推荐
- 公网传输技术之SRT协议解析(上)
点击上方"LiveVideoStack"关注我们 作者:张博力 编辑:Alex ▼扫描下图二维码或点击阅读原文▼ 了解音视频技术大会更多信息 " 摘 要:SRT协议( ...
- Android——SRT字幕文件的下载、解压、转换、显示
SRT字幕文件的下载.解压.显示 简介 下载 创建文件夹 文件下载 下载调用以及文件解析调用 解析 ZIP文件解析 外部引用 转换 转换SRT字幕文件 获取SRT文件list实体数据 显示 字幕显示 ...
- 使用 shell 脚本拼接 srt 字幕文件 (srtcat)
背景 前段时间迷上了做 B 站视频,主要是摩托车方面的知识分享.做的也比较粗糙,就是几张图片配上语音和字幕进行解说.尝试过自己解说,发现录制视频对节奏的要求还是比较高的,这里面水太深把握不住.好在以 ...
- python-视频声音根据语音识别自动转为带时间的srt字幕文件
文章目录 问题 解决 截图 srt格式原理 识别语音的讯飞接口调用函数 处理结果,得到字符 列表合成字典 问题 讯飞文字转写长语音只有5h免费,想要体验50000分钟白嫖的,看我另一篇文章 最近在看一 ...
- 【Python文本处理】基于运动路线记录GPX文件的基础运动速度求解,并转为SRT字幕格式(不需要安装三方库)
[Python文本处理]基于运动路线记录GPX文件的基础运动速度求解,并转为SRT字幕格式(不需要安装三方库) 解析 GPX文件格式 GPX文件本身其实就是坐标.海拔.时间.心率等综合性的xml文件 ...
- srt编辑的文件在linux显示乱码,解决看本地视频srt字幕乱码问题教程-srt文件
大家好,我是Ysaku,今天给大家带来一个解决srt字幕乱码问题的教程,今天在做视频的时候发现下载的视频配上srt字幕后显示的字幕会出现乱码情况,在修正问题后,我想大家也会也到这样的情况,那正好今天分 ...
- caption里面能不能加字体颜色的设置_短视频快速加SRT字幕这事 有几条Pr避坑指南请查收...
最近短视频挺火,特别是微信开始进行"视频号"测试以来,短视频更是很多人挂在嘴边的话题. 窝在家里的这段时间,"假装是极客"也在刻苦钻研视频方面的"新技 ...
- srt字幕怎么导入视频 (视频字幕合并教程)
不知道怎么将srt字幕怎么导入视频?来看下这个简单的教程吧! 第一步: 首先,下载安装4K Video Downloader软件到你的电脑上,然后运行它. 第二步: 打开软件,然后选择"转换 ...
- 编辑SRT字幕,添加在视频中播放
最近很多人觉得在视频编辑SRT字幕很难剪辑,这里给大家分享一个简单的剪辑方法,一起来看如何批量剪辑在视频画面添加SRT字幕的操作步骤吧. 准备工具: 在电脑上安装一个媒体梦工厂 多个视频素材 开始操作 ...
最新文章
- java ajax 404_java – 在jQuery AJAX中调用Spring控制器时发现404错误
- 剑指offer.机器人的运动范围
- 17 redis -key设计原则
- Android字符串资源及其格式化
- r语言中对向量求条件语句_R中的条件语句
- 幕享 for Mac(全平台全设备投屏共享软件)中文版
- Cookie的格式及组成
- 新版IAR软件打开旧版本创建的项目时出现的三个错误及其解决方案 is too long for segment definition
- C# 二维码生成代码
- 如何成为深度学习工程师
- 网站漏洞修复公司 对网站上传文件漏洞的修复与安全加固
- 【MQTT学习】lesson8. :Retained 消息和 LWT
- 用Python写的水仙花数程序,感觉这个也比较好懂
- Android调取拍照和获取拍照后的照片
- 一键备份Android系统(软件)
- Apache构建虚拟主机
- servlet part对象文件上传
- linux查看以i开头的文件,Linux文件查找Day.13
- 新的vue项目-qq音乐网页版
- idea中@SpringBootApplication报红