閱讀64 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[Qt教程] 第49篇 進階(九) 多媒體應用簡介

[Qt教程] 第49篇 進階(九) 多媒體應用簡介

樓主
 發表於 2013-10-7 09:50:36 | 查看: 267| 回複: 2
多媒體應用簡介


版權聲明

該文章原創於作者yafeilinux,轉載請注明出處!




導語


     Qt對於音頻視頻的播放和控製等多媒體應用提供了強大的支持。要想使計算機發出響聲,最簡單的方法是調用QApplication::beep()靜態函數;而對於簡單的聲音播放,可以使用 QSound類;對於簡單的動畫播放,可以使用QMovie類;要想對音頻視頻實現更多的控製,可以使用Phonon多媒體框架;而對於音頻視頻底層的控製,可以使用QtMultimedia模塊。
雖然在Qt 5中已經已經放棄了Phonon,但是使用Qt 4時,Phonon還是一個很好的選擇,所以這裏我們也對其進行了簡單介紹。



環境:Windows Xp + Qt 4.8.5+QtCreator2.8.0




目錄


一、使用QSound播放聲音
二、Phonon 簡介
三、使用Phonon播放音頻
四、使用Phonon播放視頻





正文


一、使用QSound播放聲音



1.新建Qt Gui應用,名稱為“mySound”,類名“MainWindow”和基類QMainWindow保持默認即可。

2.完成後在mainwindow.cpp文件中添加頭文件#include <QSound>,然後在構造函數中添加如下一行代碼:

QSound::play("../mySound/sound.wav");
       這時運行程序就可以播放指定的音頻文件了,注意這裏將音頻文件放在了項目目錄中。因為現在QSound並不支持資源文件,所以音頻文件必須要放在程序外麵。除了簡單的使用靜態函數進行播放外,也可以先構建一個QSound對象,然後再調用play()槽進行播放,可以使用stop()槽來停止聲音的播放,還可以使用setLoops()函數設置播放重複的次數,如果設置為-1表示無限循環。



3.先到mainwindow.h文件中添加前置聲明classQSound;然後聲明一個私有對象:
QSound *sound;
再到mainwindow.cpp文件中,將構造函數裏添加的調用play()函數的代碼更改為:
sound = new QSound("../mySound/sound.wav"this);
       然後我們雙擊mainwindow.ui文件進入設計模式,向界麵上添加兩個Push Button和一個Spin Box,並將兩個按鈕的文本分別改為“播放”和“停止”。然後更改Spin Box的屬性,
將最小值minimum設置為-1,將當前值value設置為1。最後分別轉到兩個按鈕的clicked()槽和Spin BoxvalueChanged(int )槽,更改它們的內容如下:

void MainWindow::on_pushButton_clicked()
{ // 播放按鈕
   sound->play();
}
void MainWindow::on_pushButton_2_clicked()
{ // 停止按鈕
   sound->stop();
}
void MainWindow::on_spinBox_valueChanged(int value)
{
   sound->setLoops(value);  
}



4.現在運行程序,可以設置播放的次數,然後使用開始按鈕進行播放,使用停止按鈕來停止播放了。要說明一下,在Windows平台上,如果設置了循環次數,那麼stop()函數無法立即停止播放,需要完成當前的循環才可以停止播放。



       使用QSound可以實現一些簡短的聲音的播放,使用它來實現單擊按鈕或者其他事件的音效是很好的選擇。根據平台的音頻設備的不同,如果使用QSound同時播放多個音頻文件,那麼後麵播放的聲音或者會與前麵播放的聲音進行混合,或者會停止前麵播放的聲音,在Windows平台上,新播放的聲音會停止前麵播放的聲音。如果要播放其他格式的音頻文件,或者需要對播放進行更多的控製,那麼就需要使用Phonon多媒體框架來實現了。



二、Phonon 簡介

Phonon包含三個基本的概念:媒體對象(Media Objects)、匯點(Sinks)和路徑(Paths)。媒體對象是MediaObject類的一個實例,用來管理媒體源,例如一個音樂文件,它提供開始、停止和暫停等簡單的播放控製功能;匯點用來從Phonon中輸出媒體,例如在部件上渲染視頻或者將音頻傳送到聲卡,匯點通常是一個渲染設備,如VideoWidget;路徑用來連接Phonon對象,例如連接一個媒體對象和一個匯點,這樣形成的關係圖在Phonon中被稱為媒體圖(mediagraph)。下圖是一個音頻流的媒體圖:


01.png





下圖是一個播放帶有聲音的視頻文件的媒體圖:


02.png


多媒體功能並不是由Phonon本身實現的,而是由後端(也常被稱為引擎)實現的,這包含了連接、管理和驅動底層的硬件或中間技術。對於編程人員來說,這意味著媒體的節點,例如媒體對象、處理器和匯點,它們都由後端提供。而且,後端還負責構建媒體圖,例如連接各個節點。
       Qt使用的後端,在Windows上是DirectShow,在Mac上是QuickTime,在Linux上是Gstreamer。依賴於底層的係統,在不同的平台上所提供的功能會有所不同。後端可以顯示頂層係統的信息,可以獲取它支持的媒體格式,例如AVImp3或者OGG等。



三、使用Phonon播放音頻

當播放音頻時,需要創建一個媒體對象,然後將它連接到一個音頻輸出節點,該節點由AudioOutput類提供,它用來將音頻輸出到聲卡。

1.新建Qt Gui應用,名稱為“myPhonon1”,類名“MainWindow”和基類QMainWindow保持默認即可。完成後,在項目文件myPhonon1.pro中添加如下一行代碼:

QT       += phonon
然後保存該文件。



2.再到mainwindow.cpp文件中添加頭文件包含:
#include <phonon>
#include <QDebug>
#include <QUrl>
並在構造函數中添加如下代碼:

Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
mediaObject->setCurrentSource(Phonon::MediaSource("../myPhonon1/mysong.mp3"));
Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::Path path = Phonon::createPath(mediaObject, audioOutput);
mediaObject->play();

       AudioOutput類用來向音頻輸出設備發送數據,音頻輸出需要使用createPath()函數連接到媒體對象上。AudioOutput提供了函數來控製音量的大小,還可以設置靜音,而且Phonon還使用AudioOutput提供了一個音量控製部件VolumeSlider類,它是QWidget的子類。另外,Phonon中也提供了播放進度滑塊SeekSlider,該類也是QWidget的子類,它需要連接到媒體對象上。



3.往源碼目錄中添加一個mysong.mp3文件,運行程序就可以自動播放了。不過,現在還無法進行任何的控製。大家可以查看《Qt及Qt Quick開發實戰精解》的音樂播放器實例,那是一個比較完整的播放器例子。



四、使用Phonon播放視頻



1.新建Qt Gui應用,項目名稱為“myPhonon2”,基類選擇QWidget,類名為“Widget”。完成後先到項目文件myPhonon2.pro中添加代碼:

QT       += phonon
然後保存該文件。



2.播放視頻,可以使用VideoWidget類,該部件可以自動選擇可用的設備來播放視頻。VideoWidget並不會播放媒體流中的音頻,如果要播放視頻中的音頻,那麼就要創建一個AudioOutput節點。在mainwindow.cpp文件中添加頭文件包含:
#include <phonon>
#include <QAction>
#include <QVBoxLayout>
#include <QToolBar>

再在構造函數中添加如下代碼:
  1. // 創建媒體圖
  2. Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
  3. Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(this);
  4. Phonon::createPath(mediaObject, videoWidget);
  5. Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(
  6.                                     Phonon::VideoCategory, this);
  7. Phonon::createPath(mediaObject, audioOutput);
  8. mediaObject->setCurrentSource(Phonon::MediaSource(
  9. "../myPhonon2/myVideo.WMV"));

  10. // 創建播放進度滑塊
  11. Phonon::SeekSlider *seekSlider = new Phonon::SeekSlider(
  12. mediaObject, this);

  13. // 創建工具欄,包含了播放、暫停和停止動作,以及控製音量滑塊
  14. QToolBar *toolBar = new QToolBar(this);
  15. QAction *playAction = new QAction(style()->standardIcon(QStyle::SP_MediaPlay), tr("播放"), this);
  16. connect(playAction, SIGNAL(triggered()), mediaObject, SLOT(play()));
  17. QAction *pauseAction = new QAction(style()->standardIcon(QStyle::SP_MediaPause), tr("暫停"), this);
  18. connect(pauseAction, SIGNAL(triggered()), mediaObject, SLOT(pause()));
  19. QAction *stopAction = new QAction(style()->standardIcon(QStyle::SP_MediaStop), tr("停止"), this);
  20. connect(stopAction, SIGNAL(triggered()), mediaObject, SLOT(stop()));
  21. Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider(audioOutput, this);
  22. volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  23. toolBar->addAction(playAction);
  24. toolBar->addAction(pauseAction);
  25. toolBar->addAction(stopAction);
  26. toolBar->addWidget(volumeSlider);

  27. // 創建布局管理器,將各個部件都添加到布局管理器中
  28. QVBoxLayout *mainLayout = new QVBoxLayout;
  29. videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  30. mainLayout->addWidget(videoWidget);
  31. mainLayout->addWidget(seekSlider);
  32. mainLayout->addWidget(toolBar);
  33. setLayout(mainLayout);
複製代碼
       這裏創建了兩個路徑,分別用於視頻流和音頻流。創建VideoWidget時不需要指定類別,它會自動指定為VideoCategory類別,我們需要做的隻是確保AudioOutput也在同一個類別中。Phonon中的SeekSlider類提供了一個滑塊來定位媒體流,隻要與媒體對象MediaObject連接後,該部件就可以自動和媒體流的播放進度同步起來,不需要我們手動進行信號和槽的關聯。Phonon中的VolumeSlider部件提供了一個用來控製音頻輸出設備音量的滑塊,該滑塊還會默認顯示一個可以設置靜音的圖標,這個圖標可以使用setMuteVisible()來移除。



3.需要將一個myVideo.WMV的視頻文件複製到源碼目錄,然後運行程序,效果如下圖所示。

03.jpg




結語


Movie類是一個使用QImageReader來播放動畫的便捷類。該類用來顯示沒有聲音的簡單動畫,主要支持GIF和MNG格式的文件;在Qt 4.6中新加入了QtMultimedia模塊來提供一些底層的多媒體功能,比如音頻的采集和回放、頻譜分析、操作視頻幀等。關於這兩個類的使用,可以參考《Qt Creator 快速入門》的第13章,進一步學習Phonon的內容,可以參考第14章。




涉及到的源碼:  myPhonon1.rar (176.79 KB, 下載次數: 0)  myPhonon2.rar (2.54 MB, 下載次數: 1) mySound.rar (199.64 KB, 下載次數: 1) 




最後更新:2017-04-03 14:54:11

  上一篇:go 簡單實用人事管理係統 編程語言winform C#
  下一篇:go WAS 8.5在HP-UX Itanium上無法圖形化安裝啟動IIM之解