Qt播放音頻文件的方法有好多中,簡單介紹幾種
不過一下幾種方式都需要在Qt工程文件中添加
- QT += multimedia
第一
QMediaPlayer類
可以播放MP3文件,同時使用也是最簡單的了,具體代碼
- {
- player = new QMediaPlayer;
- connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
- player->setMedia(QUrl::fromLocalFile("E:\\CloudMusic\\林沁簡介 - 太陽的后裔 MIX.mp3"));
- player->setVolume(30);
- player->play();
- }
該中實現方式適合單個文件的,如果有多個文件需要播放,那么需要使用下面的方式
- {
- playlist = new QMediaPlaylist;
- playlist->addMedia(QUrl::fromLocalFile("E:\\CloudMusic\\林沁簡介 - 太陽的后裔 MIX.mp3"));
- playlist->addMedia(QUrl::fromLocalFile("E:\\CloudMusic\\芭比 - 觸電 (完整版).mp3"));
- playlist->addMedia(QUrl::fromLocalFile("E:\\CloudMusic\\郭芯語 - 快點告訴你.mp3"));
- playlist->setCurrentIndex(1);
- player = new QMediaPlayer;
- player->setPlaylist(playlist);
- player->play();
- }
源代碼工程:http://download.csdn.net/detail/z609932088/9502687
第二
使用QsoundEffect類
核心代碼
- effect.setSource(QUrl::fromLocalFile("E:\\CloudMusic\\林沁簡介 - 太陽的后裔 MIX.wav"));
- effect.setLoopCount(QSoundEffect::Infinite);
- effect.setVolume(1.0f);
- effect.play();
源代碼工程:http://download.csdn.net/detail/z609932088/9502709
第三種,是播放pcm裸流的
詳見“燦哥哥的博客”
連接地址:http://blog.csdn.net/caoshangpa/article/details/51224678
原文連接內容
這兩種方法都需要在.pro文件中加入multimedia模塊。方法一是通過QAudioOutput實現的,先用QFile打開PCM文件,然后進行音頻參數設置,最后調用QAudioOutput的start函數進行播放;方法二也用到了QAudioOutput,先將PCM文件讀取到內存,然后進行音頻參數設置,最后從內存中定時讀取部分數據,調用QIODevice的write函數將這部分數據寫入到揚聲器。與方法一相比,方法二雖然麻煩,但是這種方法是進行語音編解碼和語音網絡傳輸的基礎。
方法一:
#include <QApplication> #include <QFile> #include <QAudioFormat> #include <QAudioOutput> int argc, *argv[])
- );
- QAudioFormat audioFormat;
- audioFormat.setSampleRate(44100);
- audioFormat.setChannelCount(2);
- audioFormat.setSampleSize(16);
- audioFormat.setCodec();
- audioFormat.setByteOrder(QAudioFormat::LittleEndian);
- audioFormat.setSampleType(QAudioFormat::UnSignedInt);
- QAudioOutput( audioFormat, 0);
- a.exec();
- }
方法二:
Widget::Widget(QWidget *parent) :
- QWidget(parent),
- Ui::Widget)
- {
- );
- *file=fopen(,);
- (!file)
- {
- ;
- [fileLength+1];
- );
- (!info.isFormatSupported(audioFormat)) {
- QAudioOutput(audioFormat, );
- QTimer();
- connect(timer, SIGNAL(timeout()), SLOT(slotTimeout()));
- }
- (i<fileLength/1764)
- (audioOutput&&audioOutput->state()!=QAudio::StoppedState&&
- chunks = audioOutput->bytesFree()/audioOutput->periodSize();
- (chunks)
- (tempBuffer.length() >= audioOutput->periodSize())
- ;
- }
- }
PCM裸流1秒的數據量是44100×16×2/8=176400字節,那么10毫秒的數據量就是1764字節,所以定時器定時10毫秒,每隔10毫秒從數組中順序讀取1746個字節。
PCM音頻文件的制作參考:http://blog.csdn.net/caoshangpa/article/details/51218994
音頻參數解析參考:http://blog.csdn.net/caoshangpa/article/details/51218597
測試用PCM音頻文件下載鏈接:http://download.csdn.net/detail/caoshangpa/9497751
方法二源碼:見http://blog.csdn.net/caoshangpa/article/details/51224678