Qt 播放音頻文件


Qt播放音頻文件的方法有好多中,簡單介紹幾種

不過一下幾種方式都需要在Qt工程文件中添加

  1. QT       += multimedia  


第一


QMediaPlayer類

可以播放MP3文件,同時使用也是最簡單的了,具體代碼

  1. {  
  2.     player = new QMediaPlayer;  
  3.     connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));  
  4.     player->setMedia(QUrl::fromLocalFile("E:\\CloudMusic\\林沁簡介 - 太陽的后裔 MIX.mp3"));  
  5.     player->setVolume(30);  
  6.     player->play();  
  7. }  


該中實現方式適合單個文件的,如果有多個文件需要播放,那么需要使用下面的方式

  1. {  
  2.         playlist = new QMediaPlaylist;  
  3.         playlist->addMedia(QUrl::fromLocalFile("E:\\CloudMusic\\林沁簡介 - 太陽的后裔 MIX.mp3"));  
  4.         playlist->addMedia(QUrl::fromLocalFile("E:\\CloudMusic\\芭比 - 觸電 (完整版).mp3"));  
  5.         playlist->addMedia(QUrl::fromLocalFile("E:\\CloudMusic\\郭芯語 - 快點告訴你.mp3"));  
  6.         playlist->setCurrentIndex(1);  
  7.   
  8.         player = new QMediaPlayer;  
  9.         player->setPlaylist(playlist);  
  10.   
  11.         player->play();  
  12.     }  


源代碼工程:http://download.csdn.net/detail/z609932088/9502687



第二

使用QsoundEffect類


核心代碼

  1. effect.setSource(QUrl::fromLocalFile("E:\\CloudMusic\\林沁簡介 - 太陽的后裔 MIX.wav"));  
  2. effect.setLoopCount(QSoundEffect::Infinite);  
  3. effect.setVolume(1.0f);  
  4. 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函數將這部分數據寫入到揚聲器。與方法一相比,方法二雖然麻煩,但是這種方法是進行語音編解碼和語音網絡傳輸的基礎。

方法一:

 

[cpp] 

 #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();  
  • }  

方法二:

 

[cpp] 

 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()));    
  • }  
[cpp] 

 void   i=0;  

  •     (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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM