qt实现播放视屏的时候,加载外挂字幕(.srt文件解析)

之前用qt写了一个在windows下播放视频的软件,具体介绍参见qt编写的视频播放器,windows下使用,精致小巧_GreenHandBruce的博客-CSDN博客

后来发现有些视频没有内嵌字幕,需要外挂字幕,这时候,我就想着把加载外挂字幕的功能加上。如下图:

这里先做了解析.srt字幕文件的功能。具体实现如下

1.先在窗口放一个label,将label调整到界面底部,设置字体,颜色

//显示字幕用的label;
    labelSubTitle = new myLabel(this);
//    labelSubTitle->setText("这里显示字幕文件");
    QFont font("微软雅黑",15,QFont::Bold);
    QPalette palette = labelSubTitle->palette();
    palette.setColor(QPalette::WindowText,Qt::white);
    labelSubTitle->setPalette(palette);
    labelSubTitle->setFont(font);
    labelSubTitle->setAlignment(Qt::AlignCenter);

2.在打开视频文件的时候找到同文件夹下的.srt文件

    int nIndex = fileName.lastIndexOf('.');//寻找‘.’符号在字符串中的id
    nIndex++;
    QString srtfile =fileName.mid(0,nIndex); //截取‘.’符号后面的字符串,这是为了获取文件后缀名
    srtfile +="srt";
    EncodingFormat code = FileCharacterEncoding(srtfile);
    QFile file(srtfile);
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug()<<"未找到外挂字幕文件:"<<srtfile<<endl;
    }

3.解析.srt文件,先看一下.srt字幕文件格式如下:


然后写个结构体用来存放解析之后的srt内容,如下:

struct SrtInfo
{
    qint16 Num;
    QTime dtStart;
    QTime dtEnd;
    QString strSubTitle;
};

然后解析,在解析的时候要注意.srt的编码格式,(编码格式这块参见我上一篇文章qt按照不同编码格式读取文字(UTF-16LE,UTF-8,UTF-8BOM,UTF-16BE)-CSDN博客)

void VideoPlayer::ParseSubTitle(QString fileName)
{
    int nIndex = fileName.lastIndexOf('.');//寻找‘.’符号在字符串中的id
    nIndex++;
    QString srtfile =fileName.mid(0,nIndex); //截取‘.’符号后面的字符串,这是为了获取文件后缀名
    srtfile +="srt";
    EncodingFormat code = FileCharacterEncoding(srtfile);
    QFile file(srtfile);
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug()<<"未找到外挂字幕文件:"<<srtfile<<endl;
    }
    m_SrtInfoLst.clear();
    QTextCodec::ConverterState state;
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    if(code==EncodingFormat::UTF16LE)
    {
        codec = QTextCodec::codecForName("UTF-16LE");
    }
    else if(code==EncodingFormat::UTF8)
    {
        codec = QTextCodec::codecForName("UTF-8");
    }
    else if(code==EncodingFormat::UTF8BOM)
    {
        codec = QTextCodec::codecForName("UTF-8");
    }
    else if(code==EncodingFormat::UTF16BE)
    {
        codec = QTextCodec::codecForName("UTF-16BE");
    }
    QTextStream stream_src(&file);
    stream_src.setCodec(codec);
    while(!stream_src.atEnd()) {
        QString str = stream_src.readLine();
        str = str.replace('\r',"");//替换回车符
        str = str.replace('\n',"");//替换换行符
        bool ok;
        qint16 nID = str.toInt(&ok,10);
        if(ok)
        {
            SrtInfo info;
            info.Num = nID;
            if(stream_src.atEnd())
                break;
            QString str2=stream_src.readLine();
            str2 = str2.replace('\r',"");//替换回车符
            str2 = str2.replace('\n',"");//替换换行符
            str2 = str2.replace(' ',"");//替换空格符
            if(str2=="")
                continue;
            info.dtStart = QTime::fromString(str2.split('-').first(),"hh:mm:ss,zzz");
            info.dtEnd = QTime::fromString(str2.split('>').last(),"hh:mm:ss,zzz");

            QString str3=stream_src.readLine();
            if(str3=="")
                continue;
            str3 = str3.replace('\r',"");//替换回车符
            str3 = str3.replace('\n',"");//替换换行符
            info.strSubTitle = str3;

            QString str4=stream_src.readLine();
            if(str4=="")
                continue;
            str4 = str4.replace('\r',"");//替换回车符
            str4 = str4.replace('\n',"");//替换换行符
            info.strSubTitle.append('\n');
            info.strSubTitle.append(str4);

            m_SrtInfoLst.append(info);
        }
    }
    file.close();
}

然后就是在播放视频的时候,找到当前时刻对应的字幕并显示在label上,如下:

void VideoPlayer::positionChanged(qint64 position)
{
    m_positionSlider->setValue(position);
    QTime timeCrt = QTime(0,0,0);
    timeCrt = timeCrt.addMSecs(position);
    QTime timeTotal =QTime(0,0,0);
    timeTotal = timeTotal.addMSecs(m_mediaPlayer->duration());
    QString str = timeCrt.toString("hh:mm:ss")+"/"+timeTotal.toString("hh:mm:ss");
//    m_labelTiem->setFont(QFont::gra);
    m_labelTiem->setText(str);
    if(m_mediaPlayer->duration()>0&&position>=m_mediaPlayer->duration())
    {
        //图标变成play
        QImage img;
        img.load(":/play");
        m_labelPlay->setPixmap(QPixmap::fromImage(img));
    }
    bool bShow = false;
    foreach(const SrtInfo item,m_SrtInfoLst)
    {
        if(item.dtStart<timeCrt && item.dtEnd>timeCrt)
        {
            labelSubTitle->setText(item.strSubTitle);
            bShow = true;
            break;
        }
    }
    if(!bShow)
    {
        labelSubTitle->setText("");
    }
}

完整代码参见

https://download.csdn.net/download/weixin_43935474/88561361

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/184100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「首届广州百家新锐企业」名单出炉!数说故事遴选入围

11月20日&#xff0c;由中共广州市委统战部、市工商联、市工信局、市国资委、市科技局联合主办的首届广州百家新锐企业融通创新交流会在广州成功举办。 为推动广州市中小民营企业的创新发展&#xff0c;践行新发展理念&#xff0c;厚植广州产业根基&#xff0c;现场发布首届广…

云计算时代来临,传统运维怎样做才能不被“杀死”?

据Forrester Research的数据显示&#xff0c;2021年全球公有云基础设施市场将增长35%&#xff0c;达到1200亿美元&#xff0c;云计算将继续在疫情复苏的过程中“占据中心位置”。 全球用于云计算的IT支出占比将持续增长&#xff0c;企业对于云计算开发人才需求紧迫&#xff0c…

面向自然语言处理任务的预训练模型综述

源自&#xff1a;计算机应用 作者&#xff1a;刘睿珩&#xff0c; 叶霞&#xff0c; 岳增营 “人工智能技术与咨询” 发布 摘 要 近年来&#xff0c;深度学习技术得到了快速发展。在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;随着文本表征技术…

c语言新龟兔赛跑

以下是一个使用C语言编写的新的龟兔赛跑游戏&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>int main() { int distance, turtle_speed, rabbit_speed, turtle_time, rabbit_time, rabbit_lead; srand(time(NULL)); // 随机数种…

2024-NeuDS-数据库题目集

一.判断题 1.在数据库中产生数据不一致的根本原因是冗余。T 解析&#xff1a;数据冗余是数据库中产生数据不一致的根本原因&#xff0c;因为当同一数据存储在多个位置时&#xff0c;如果其中一个位置的数据被修改&#xff0c;其他位置的数据就不一致了。因此&#xff0c;在数据…

Azure Machine Learning - 创建Azure AI搜索服务

目录 准备工作查找 Azure AI 搜索产品/服务选择订阅设置资源组为服务命名选择区域选择层创建服务配置身份验证扩展服务何时添加第二个服务将多个服务添加到订阅 Azure AI 搜索是用于将全文搜索体验添加到自定义应用的 Azure 资源&#xff0c;本文介绍如何创建Azure AI搜索服务 …

Python,FastAPI,mLB网关,无法访问/docs

根源就是js和ccs文件访问路由的问题&#xff0c;首先你要有本地的文件&#xff0c;详情看https://qq742971636.blog.csdn.net/article/details/134587010。 其次&#xff0c;你需要这么写&#xff1a; /unicontorlblip就是我配置的mLB网关路由。 app FastAPI(titleoutpaint…

做外贸的你崩溃过吗

某日&#xff0c;孔先生问我&#xff0c; 前几天的那个单子怎么样了&#xff1f;看你一会找工厂拍照片&#xff0c;一会找办公室录制视频&#xff0c;半夜还在拿着手机和客户打电话&#xff0c;现在怎么也不提这个进展了&#xff0c;我回答道&#xff1a;黄了。 此时孔先生一股…

短剧付费变现小程序源码系统+开通会员+在线充值 附带完整的搭建教程

大家好啊&#xff0c;今天小编来给大家分享一款短剧付费变现小程序源码系统。近年来&#xff0c;随着互联网技术的飞速发展&#xff0c;短剧成为了一个备受瞩目的领域。短剧以其简洁、紧凑的故事情节和制作周期短、传播速度快的特点&#xff0c;成为了越来越多人的选择。然而&a…

全国测绘资质管理信息系统测绘资质申报流程

讲解一期关于测绘资质申请如何操作&#xff0c;在哪操作的问题&#xff0c;想要知道的按以下流程操作即可 &#xff08;注&#xff1a;以下操作为资质系统操作&#xff0c;想要能把资质申请下来&#xff0c;还需满足以下要求&#xff0c;后面会和系统操作一起统一讲解&#xf…

项目管理体系文件代码评审规范

代码评审的目的&#xff1a; 1、在项目早期就能够发现代码中的BUG 2、帮助初级开发人员学习高级开发人员的经验&#xff0c;达到知识共享 3、避免开发人员犯一些很常见&#xff0c;很普通的错误 4、保证项目组人员的良好沟通 5、项目或产品的代码更容易维护 软件开发全文档获取…

党建信息管理系统源码 支持在线交党费 附带完整的搭建教程

传统的党建管理模式通常采用手工方式&#xff0c;不仅效率低下&#xff0c;而且容易出错。随着组织规模的扩大和党员数量的增加&#xff0c;这种管理方式已经无法满足现实需求。此外&#xff0c;传统的党建管理模式缺乏在线交党费功能&#xff0c;给党员带来不便。因此&#xf…

斐波那契数列数列系列问题详解

斐波那契数列数列是我们学习递归的入门问题&#xff0c;是一种非常经典的题型&#xff0c;也衍生出了一些更复杂的题型&#xff0c;这一节就让我们彻底理解斐波那契数列系列问题。 一、概念介绍 1、什么是斐波那契数列&#xff1f; 斐波那契数列&#xff08;Fibonacci sequenc…

芯片设计—低功耗isolation cell

&#xff08;一&#xff09;低功耗isolation cell的目的 低功耗架构设计需要前后端拉通规划&#xff0c;前端设计有PMU功耗管理单元&#xff0c;比如A模块电压常开&#xff0c;B模块电压可关断&#xff0c;那么请思考&#xff0c;当B模块关断电压后&#xff0c;B模块输出到A模…

案例025:基于微信小程序的移动学习平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

浪涌Surge整改:保护和优化电力系统!|深圳比创达电子EMC

一、浪涌现象简介 浪涌是一种在电气系统中常见的现象&#xff0c;其涉及电压、电流的突然增加&#xff0c;超过系统的正常操作范围。这可能是由许多因素引起的&#xff0c;如雷击、设备故障、或电网中的突然负荷变化。浪涌可能导致设备损坏&#xff0c;甚至可能危及人员安全。…

重磅发布,Whale 帷幄打出 AGI 场景化落地「组合拳」

11 月 23 日&#xff0c;「Whale 帷幄」举办了秋季发布会「AGI for Growth 释放增长的 AGI 力量」。 继今年年初提出「MarketingGPT」帮助品牌用 AGI 技术重塑工作流程和生产方式后&#xff0c;帷幄持续研磨技术与产品&#xff0c;聚焦垂类场景&#xff0c;打造「MarketingGPT …

护眼灯到底有用吗?真正可以护眼的护眼台灯推荐

中国消费者协会联合江苏省消费者权益保护委员会、浙江省消费者权益保护委员会和浙江台州市消费者权益保护委员会于今年上半年开展了读写台灯比较试验。结果显示&#xff0c;在73款样品中&#xff0c;仅12款样品各项测试指标良好。飞利浦、欧普、得力等品牌样品不合格。 面对市面…

微信小程序开发资源汇总

本文收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。本文不是一篇关于如何学习微信小程序的入门指南&#xff0c;也非参考手册&#xff0c;只是一些资料的整理。 本仓库中的资料整理自网络&#xff0c;也有一些来自网友的推荐。 官方文档 小程序设计指南…

C语言贪吃蛇(有详细注释)

这个贪吃蛇是在比特特训营里学到的&#xff0c;同时我还写了用EasyX图形库实现的图形化贪吃蛇&#xff0c;含有每个函数的实现以及游戏中各种细节的讲解&#xff0c;感兴趣的可以去看一看。 贪吃蛇小游戏 实现效果 以下就是源码&#xff0c;感兴趣的小伙伴可以cv自己玩一玩改…