zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7899141.html
Copyright © 2011-2022 走看看