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

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7899141.html
Copyright © 2011-2022 走看看