日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

使用QT编写视频播放器总结

發(fā)布時間:2023/12/10 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用QT编写视频播放器总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是關于基于QMediaPlayer的播放器的總結,一開始我的想法就是想用opencv做一個視頻播放器,因為opencv平時用的也比較順手,但是花了半天的時間實際一做才知道事情沒那么簡單,首先使用opencv加載本地視頻文件到界面上就花了不少時間,在使用qt播放opencv傳過來的視頻的時候播放的基本原理還是沒變,仍然是一幀一幀的連續(xù)輸出就形成了視頻。但是這個地方有好幾個要注意的地方,首先,opencv自帶的waikey函數在qt里面不能用,因為本身waikey函數在opencv播放視頻時是用來設置幀間的時間間距的,此時必須要根據視頻的幀率來設置幀數之間的時間間隔;其次,waikey函數在opencv中使用習慣了沒注意到,這個函數本身是和其他函數配合起到持續(xù)輸出幀數的作用,在輸出的過程中必須有。。。(這個地方忘了,先擱置一下);因此如果直接在qt中使用這個函數的話會出現沒有畫面的情況,為此,我們需要選用qt里面的Qtimer控件,進行輸出間隔的控制,然后還是根據視頻的幀數設置輸出間隔。以上工作都搞得差不多了之后,我發(fā)現了一個最操蛋的事,這樣使用opencv輸出來的視頻是沒有聲音的!前前后后搞了一個下午,浪費了不少時間,但是也算是加深了對opencv進一步的了解了吧。

通過網上的查閱和與師兄的溝通發(fā)現,原來做視頻播放器的庫有很多,包括qt自帶的QMediaPlayer、ffmpeg等等,本來聽說ffmpeg還不錯,但是一到官網一看沒有直接的安裝包,心想還是用qt自帶的庫吧。下面是我在使用QMediaPlayer過程中遇到的一些困難和解決問題的辦法。
由于我是qt初學者,對qt中的很多機制還不是特別的了解,但是通過做了這么一個小例子,我把基本的一些問題都搞的比較清楚了,最起碼后面再碰到大部分問題時心里有個方向了。
首先是Qtimer這個控件的使用上,之前對槽與信號了解的也不是很深,以為大部分槽都可以在界面上找到,但是我這個項目做的越深越發(fā)現原來很多界面的設置可以用代碼實現,一旦用了代碼就不能簡單的使用界面一點直接跳轉的方式來寫槽與信號了。我對信號的理解就是,信號本身就是一個函數,但是不能被定義,并且要在頭文件里用signals關鍵字指出,信號不能有返回值,它僅代表在某個控件或窗體上出發(fā)了某個東西,然后由信號就會產生對應的槽函數,槽函數是和普通函數沒太大差別的函數,它本身要以關鍵字slots在頭文件中指出,在定義的時候可以寫入任意的操作。并且信號與槽機制在子窗體和父窗體的值的傳遞中起著重要作用,可以使用槽與信號實現父窗體傳值到子窗體,也可以實現子窗體傳值到父窗體,也就是說,有了槽與信號,可以很靈活的控制子父窗體數據之間的聯系。Qtimer這個控件的大部分使用都是和信號與槽結合在一起的,connect(timer,SIGNAL(timeOut()),this,SLOT(on_timeout()));通過初始化一個timer并且設置其時間間隔,以毫秒為單位,之后每過一個時間間隔,就會發(fā)出一個信號使槽函數開始運行,知道設置timer.stop(),信號停止發(fā)送。因此利用QTimer這個控件可以實現很多定時操作。在這個項目里面主要是用來設置當播放視頻全屏時鼠標懸浮一段時間之后自動隱藏,然后在鼠標移動之后重新出現鼠標指針,但是這個地方有個問題,鼠標移動必須按住任意一個按鍵才能使指針顯示出來,并且我使用的就是MouseMoveEvent(),這個問題目前還沒解決。
然后就是界面的布局上,之前對qt的界面布局很迷,因為一開始學習編程時接觸了一段時間的C#,C#的界面布局感覺要簡單很多,但是這么幾天我發(fā)現其實qt的布局也很方便,一旦理解了就很容易做出來比較好看的布局。關于布局第一點是五種布局方式,垂直、水平、柵格、群組等,在布局的時候我發(fā)現視頻和控制按鈕得分割開,我一開始是不知道用什么方式的,后來在網上一查,可以使用QSplitter進行分割,QSplitter也是控件,并且是由分割線和本體組成的,分割線的粗細和顏色都可以自定義設置,但是粗細只能是整數,因此無法設置小于一的線寬,一般默認情況下Qsplitter的分割線是可以被移動的,但是也可以通過設置分割線的屬性值setEnabled來設置其不可調整比例,主要用法如下
QSplitterHandle *pHandle = splitter->handle(1); pHandle->setEnabled(false); pHandle->setStyleSheet("background-color:rgba(0,48,77,0.7)"); QSplitterHandle *cHandle = splitter_video->handle(1); cHandle->setEnabled(false); cHandle->setStyleSheet("background-color:rgba(0,48,77,0.7)");
主要就是通過獲取splitter的handle值來單獨設置,網上很多說可以利用setOpaque函數的值來設置的,我始終沒設置成功,最終就是用的上述方法來設置的。此外關于splitter的一點就是初始比例如果不設置的話就是默認的1:1,在某些情況下自己設置的比例如果不生效就會自動采用默認比例。我這個項目里主要用到了兩個splitter,所以在分割的時候一定注意比例的問題,當時一開始我怎么設置都不生效,后來我發(fā)現對于QMainWindow本身要設置一個主窗體,因為中間的窗口很多,會涉及到沖突的問題,我的做法是用一個最大的splitter設置為窗體的主窗體,然后其他所有的布局都在這上面進行,在布局的時候還遇到了一個問題,就是涉及到控件的嵌套布局方式,當對多個控件使用組合布局時一定不要先設置父窗體指針,要在最后一個布局上設置才會生效。
`QHBoxLayout *hbLayoutCtrl = new QHBoxLayout();
hbLayoutCtrl->addWidget(labelTime);
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addWidget(btn_stop);
hbLayoutCtrl->addWidget(btn_previous);
hbLayoutCtrl->addWidget(btn_play);
hbLayoutCtrl->addWidget(btn_next);
hbLayoutCtrl->addWidget(btn_volume);
hbLayoutCtrl->addWidget(audio_slider);
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addWidget(btn_fullScreen);
hbLayoutCtrl->addWidget(btn_hidePlayList);
//進度條的設置 涉及到多個布局混合的方式,一定要在最終的布局里面再設置父窗口指針
slider->setOrientation(Qt::Horizontal);
slider->setVisible(false);
audio_slider->setOrientation(Qt::Horizontal);
QHBoxLayout *hbSliderLayout = new QHBoxLayout();
hbSliderLayout->addWidget(slider);

QVBoxLayout *vbLayout = new QVBoxLayout(widget_control); vbLayout->addLayout(hbSliderLayout); vbLayout->addLayout(hbLayoutCtrl); vbLayout->setMargin(0);` 這個地方是兩個水平布局然后兩個布局作為子布局在新的豎直布局里實現,一開始我指定了每個布局的父窗口指針的位置,后來發(fā)現設置之后根本不生效,后面查了好多資料才發(fā)現在多個布局中一定只能在最后的一個布局里面設置父窗口指針,否則就不生效。 在搞這個東西的時候我還發(fā)現對qt外觀格式的設置,即qss文本設置qt上各種元素的樣式,這個后續(xù)再展開說。

總結

以上是生活随笔為你收集整理的使用QT编写视频播放器总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。