资源简介
SRT SSA ASS SMI视频字幕文件解析程序,C++
支持入口文件:SubtitleParser.cpp
代码片段和文件信息
//////////////////////////////////////////////////////////////////////////
//
// smiparse.cpp
//////////////////////////////////////////////////////////////////////////
#include “stdafx.h“
#include “smiparser.h“
CSmiParse::CSmiParse() : m_langid(0)
{
}
CSmiParse::~CSmiParse()
{
Destroy();
}
BOOL CSmiParse::HasSmiSubtitle(wchar_t* strFileName)
{
wchar_t* p1 = wcsrchr(strFileName L‘.‘);
wchar_t strTmp1[256] = {0};
wcsncpy(strTmp1 strFileName p1 - strFileName);
wchar_t smifile[256];
swprintf(smifile L“%s.smi“ strTmp1);
HANDLE hFile = CreateFileW(smifile GENERIC_READ FILE_SHARE_READ NULL OPEN_EXISTING FILE_ATTRIBUTE_NORMAL NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
BOOL bRet = TRUE;
BYTE* pBuf = new BYTE[1024];
DWORD dwRead;
BOOL bSYNCStart = FALSE;
do
{
ReadFile(hFile pBuf 2 &dwRead NULL);
if(dwRead < 2)
{
bRet = FALSE;
break;
}
if(pBuf[0] == 0xff && pBuf[1] == 0xfe)
{
m_encoding = unicode;
//
ReadFile(hFile pBuf 16 &dwRead NULL);
if(dwRead < 16)
{
bRet = FALSE;
break;
}
wchar_t* p2 = (wchar_t*)pBuf;
if(_wcsnicmp(p2 L““ 6) != 0)
{
bRet = FALSE;
break;
}
}
else
{
m_encoding = ascii;
//
ReadFile(hFile pBuf + 2 6 &dwRead NULL);
if(dwRead < 6)
{
bRet = FALSE;
break;
}
char* p2 = (char*)pBuf;
if(_strnicmp(p2 ““ 6) != 0)
{
bRet = FALSE;
break;
}
}
//////////////////////////////////////////////////////////////////////////
//
subtext* pSubtext = NULL;
subtext::subitem* si;
while(ReadLine(hFile pBuf))
{
wchar_t tmptext[512] = {0};
if(m_encoding == unicode)
{
wcscpy(tmptext (wchar_t*)pBuf);
}
else
{
//MultiByteToWideChar(Core_GetDefCodePage() 0 (char*)pBuf strlen((char*)pBuf) tmptext 512);
MultiByteToWideChar(CMT_Pub::GetLangCodePage(g_PubSetting.uCurLang) 0 (char*)pBuf strlen((char*)pBuf) tmptext 512);
}
wchar_t* p3 = (wchar_t*)tmptext;
do
{
int len = wcslen(p3);
// language mark
if(p3[0] == L‘.‘)
{
LangMark lm;
// mark
wchar_t* mark = lm.langid;
mark[0] = L‘\0‘;
int i1 = 1;
for(; i1 < len; i1++)
{
if(p3[i1] != L‘ ‘)
{
*mark++ = p3[i1];
}
else
{
*mark++ = L‘\0‘;
break;
}
}
// name
wchar_t* name = lm.lang;
name[0] = L‘\0‘;
int i2 = i1;
for(; i2 < len; i2++)
{
if(_wcsnicmp(p3 + i2 L“Name:“ 4) == 0)
{
int i3 = i2 + 5;
for(; i3 < len; i3++)
{
if(isalpha(p3[i3]))
{
break;
}
}
int i4 = i3;
for(; i4 < len; i4++)
{
if(!isalpha(p3[i4]))
{
*name++ = L‘\0‘;
br
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2300 2011-09-06 23:01 Subti
文件 1413 2011-09-06 23:01 Subti
文件 8276 2011-09-06 23:01 SmiParser.cpp
文件 1130 2010-12-29 12:08 SmiParser.h
文件 11008 2011-09-06 23:02 SrtParser.cpp
文件 1254 2010-04-08 11:43 SrtParser.h
文件 26128 2011-09-06 23:02 SsaParser.cpp
文件 1288 2010-04-08 11:43 SsaParser.h
文件 24749 2010-04-07 19:02 WxList.cpp
文件 20087 2010-04-07 19:02 WxList.h
----------- --------- ---------- ----- ----
97633 10
- 上一篇:清华大学 郑莉 C++程序设计 习题答案详解
- 下一篇:画抛物线地C语言
相关资源
- vc++ 运用MFC实现基于AfxMessageBox的 自定
- MFC 自定义 MessageBox
- ADO连接ACCESS以及增、删、查、改等操
- 最短剩余时间优先算法SRTFC语言代码
- MFC做的静态文本字幕滚动
- Chrome获取MAC地址扩展程序
- UCOSII_MODBUSRTU_DEMO
- C++实战源码-显示滚动字幕的状态栏
- C++ 使用SendMessage添加组合框内容
- C++ 使用SendMessage添加列表框内容
- qt自定义弹出窗体(messagebox)
- STM32_MODBUS_RTU 基于STM32的ModbusRtu协议程
- 51单片机流动字幕
- 圣域之战C++(动态字幕输出)
- MFC程序通过SendMessage或PostMessage实现进
评论
共有 条评论