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('.');//尋找‘.’符號在字符串中的idnIndex++;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('.');//尋找‘.’符號在字符串中的idnIndex++;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()){//圖標變成playQImage 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166259.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SELinux零知識學習二十六、SELinux策略語言之類型強制(11)

接前一篇文章:SELinux零知識學習二十五、SELinux策略語言之類型強制(10) 二、SELinux策略語言之類型強制 3. 訪問向量規則 AV規則就是按照對客體類別的訪問許可指定具體含義的規則,SELinux策略語言目前支持四類AV規則: allow:表示允許主體對客體執行允許的操作。nevera…

docker compose啟動多個服務,如何查看多個服務的日志

使用docker-compose的--scale啟動多個服務&#xff0c;如何查看多個服務的日志 docker-compose -f yml路徑 logs -f --tail 100第一個-f指定yml路徑&#xff0c;不然會報錯誤no configuration file provided: not found 第二個-f是ogs的參數&#xff0c;表示實時刷新&#xff…

YOLOv5結合華為諾亞VanillaNet Block模塊

???YOLOv5實戰寶典--星級指南:從入門到精通,您不可錯過的技巧 ??-- 聚焦于YOLO的 最新版本, 對頸部網絡改進、添加局部注意力、增加檢測頭部,實測漲點 ?? 深入淺出YOLOv5:我的專業筆記與技術總結 ??-- YOLOv5輕松上手, 適用技術小白,文章代碼齊全,僅需 …

力扣labuladong一刷day19天花式遍歷

力扣labuladong一刷day19天花式遍歷 文章目錄 力扣labuladong一刷day19天花式遍歷一、48. 旋轉圖像二、54. 螺旋矩陣三、59. 螺旋矩陣 II 一、48. 旋轉圖像 題目鏈接&#xff1a;https://leetcode.cn/problems/rotate-image/ 思路&#xff1a;把矩陣向右旋轉90度&#xff0c;要…

完美解決AttributeError: ‘NoneType‘ object has no attribute ‘append‘

文章目錄 一、原始代碼二、修改后的代碼--最后一行代碼append進行了修改總結 一、原始代碼 logits_list [] # 創建一個空列表來存儲每個logitslabels_list []for i, batch in enumerate(test_tasks):with torch.no_grad():logits, labels, loss, acc self.fast_adapt(batc…

斯坦福大學引入FlashFFTConv來優化機器學習中長序列的FFT卷積

斯坦福大學的FlashFFTConv優化了擴展序列的快速傅里葉變換(FFT)卷積。該方法引入Monarch分解&#xff0c;在FLOP和I/O成本之間取得平衡&#xff0c;提高模型質量和效率。并且優于PyTorch和FlashAttention-v2。它可以處理更長的序列&#xff0c;并在人工智能應用程序中打開新的可…

【Python百寶箱】Python中的音視頻處理: 探索多樣化的庫和工具

Python中的音視頻處理: 探索多樣化的庫和工具 前言 在數字化時代&#xff0c;音視頻處理不僅僅是娛樂產業的需求&#xff0c;還滲透到了教育、醫療、安防等多個領域。Python作為一門強大而靈活的編程語言&#xff0c;為開發人員提供了豐富的資源來處理和分析音視頻數據。本文…

SQL Server Profiler基礎使用

文章目錄 SQL Server Profiler基礎使用簡介如何打開直接打開Microsoft SQL Server Management Studio工具欄打開 配置跟蹤新建跟蹤跟蹤屬性配置常規配置事件選擇 啟動跟蹤跟蹤時執行腳本跟蹤記錄 暫停跟蹤停止跟蹤 SQL Server Profiler基礎使用 簡介 一個圖形界面工具&#x…

逆矩陣相關性質與例題

1.方陣的行列式&#xff1a;就是將方陣中的每一個元素轉換至行列式中。 1.性質一&#xff1a;轉置方陣的行列式等于轉置前的行列式。&#xff08;對標性質&#xff1a;行列式與它的轉置行列式相等&#xff09; 2.性質二&#xff1a;|ka||a|*k的n次方&#xff0c;n為方陣階數。 …

芯片設計—低功耗isolation cell

&#xff08;一&#xff09;低功耗isolation cell的目的 低功耗架構設計需要前后端拉通規劃&#xff0c;前端設計有PMU功耗管理單元&#xff0c;比如A模塊電壓常開&#xff0c;B模塊電壓可關斷&#xff0c;那么請思考&#xff0c;當B模塊關斷電壓后&#xff0c;B模塊輸出到A模…

PDF控件Spire.PDF for .NET【轉換】演示:將在 C#/VB.NET 中將 PDF 轉換為 PCL

本文我們將演示如何通過調用 Spire.PDF 提供的方法 PdfDocument.SaveToStream() 將 PDF 頁面轉換為 HTML、Word、SVG、XPS、PDF 并將它們保存到流中。并且從Spire.PDF版本4.3開始&#xff0c;它新支持轉換定義范圍的PDF頁面并將其保存到流中。 Spire.Doc 是一款專門對 Word 文…

精益制造中的周轉箱和工具柜優勢

制造業&#xff08;Manufacturing industry&#xff09;是指機械工業時代利用某種資源&#xff08;物料、能源、設備、工具、資金、技術、信息和人力等&#xff09;&#xff0c;按照市場要求&#xff0c;通過制造過程&#xff0c;轉化為可供人們使用和利用的大型工具、工業品與…

大語言模型概述(二):基于亞馬遜云科技的研究分析與實踐

上期介紹了大語言模型的定義和發展歷史&#xff0c;本期將分析基于亞馬遜云科技的大語言模型相關研究方向&#xff0c;以及大語言模型的訓練和構建優化。 大語言模型研究方向分析 Amazon Titan 2023 年 4 月&#xff0c;亞馬遜云科技宣布推出 Amazon Titan 大語言模型。根據…

redis運維(十七)事務

一 redis事務 事務核心參考 ① 基礎概念 1、場景引入核心&#xff1a;通過現象思考原因? 2、事務的概念 3、事務四大特性說明&#xff1a; redis只具備部分特性 重點1&#xff1a; 原子性和一致性 重點2&#xff1a; 隔離性和持久性 ② redis的事務 1、基礎鋪墊備注&…

runapi的學習記錄

安裝地址 git clone https://github.com/star7th/showdoc.git 默認賬號與密碼 showdoc 123456 首頁 訪問地址&#xff1a;http://192.168.51.2:4042/web/#/ 進入ShowDoc首頁 登錄showdoc文檔系統 http://192.168.51.2:4042/web/#/user/login 默認賬號密碼showdoc/12345…

unity Terrain 性能問題

在實踐過程中unity發生進入場景GPU爆顯存的情況&#xff0c;經過調查發現是使用Terrain造成的問題&#xff0c;這個問題在使用一個Terrain的時候并不會發生&#xff0c;但是在使用多個時會發生。 似乎在使用過程中Terrain會直接把Terrain的整個地圖加載&#xff0c;造成移動設…

? 一文帶你了解多文件混淆加密

?&#x1f512; 一文帶你了解多文件混淆加密 目錄 &#x1f512; 一文帶你了解 JavaScript 多文件混淆加密 ipaguard加密前 ipaguard加密后 ? &#x1f512; 一文帶你了解 JavaScript 多文件混淆加密 JavaScript 代碼多文件混淆加密可以有效保護源代碼不被他人輕易盜取。…

關閉vscode打開的本地服務器端口

vscode開了本地的一個端口“8443”當本地服務器端口&#xff0c;然后隨手把VScode一關&#xff0c;后來繼續做發現8443端口已經被占用了。 ??原來&#xff0c;即便關閉了編譯器VScode&#xff0c;服務器依然是被node.exe運行著的。那這個端口怎么才能關掉呢&#xff1f; ??…

Kotlin基礎——Lambda和函數式編程

Lambda 使用 { } 定義Lamba&#xff0c;調用run運行 run { println(1) }更常用的為 { 參數 -> 操作 }&#xff0c;還可以存儲到變量中&#xff0c;把變量作為普通函數對待 val sum { x: Int, y: Int -> x y } println(sum(1, 2))maxBy()接收一個Lambda&#xff0c;傳…

EXIT外部中斷 HAL庫+cubeMX

一.cubeMX外部中斷配置 1.系統內核 2.中斷管理 3.選擇搶占優先級和響應優先級&#xff0c;共有5個等級&#xff0c;在這里就使用庫函數編寫代碼時最常用的2位搶占優先級2位響應優先級。 4.勾選使能選項&#xff0c;后面的兩個零&#xff0c;第一個代表搶占優先級的等級&#xf…