Qt 播放音频文件

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函数将这部分数据写入到扬声器。与方法一相比,方法二虽然麻烦,但是这种方法是进行语音编解码和语音网络传输的基础。

方法一:

[cpp] view
plain
 copy

  1. #include <QApplication>
  2. #include <QFile>
  3. #include <QAudioFormat>
  4. #include <QAudioOutput>
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. QFile inputFile;
  9. inputFile.setFileName("test.pcm");
  10. inputFile.open(QIODevice::ReadOnly);
  11. //设置采样格式
  12. QAudioFormat audioFormat;
  13. //设置采样率
  14. audioFormat.setSampleRate(44100);
  15. //设置通道数
  16. audioFormat.setChannelCount(2);
  17. //设置采样大小,一般为8位或16位
  18. audioFormat.setSampleSize(16);
  19. //设置编码方式
  20. audioFormat.setCodec("audio/pcm");
  21. //设置字节序
  22. audioFormat.setByteOrder(QAudioFormat::LittleEndian);
  23. //设置样本数据类型
  24. audioFormat.setSampleType(QAudioFormat::UnSignedInt);
  25. QAudioOutput *audio = new QAudioOutput( audioFormat, 0);
  26. audio->start(&inputFile);
  27. return a.exec();
  28. }

方法二:

[cpp] view
plain
 copy

  1. Widget::Widget(QWidget *parent) :
  2. QWidget(parent),
  3. ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. //获取文件的指针
  7. FILE *file=fopen("test.pcm","rb");
  8. if(!file)
  9. {
  10. qDebug()<<"Open Failed";
  11. return;
  12. }
  13. //把指针移动到文件的结尾 ,获取文件长度
  14. fseek(file,0,SEEK_END);
  15. //获取文件长度
  16. fileLength=ftell(file);
  17. //定义数组长度
  18. fileBuffer=new char[fileLength+1];
  19. //把指针移动到文件开头 因为我们一开始把指针移动到结尾,如果不移动回来 会出错
  20. rewind(file);
  21. //读文件
  22. fread(fileBuffer,1,fileLength,file);
  23. //把读到的文件最后一位 写为0 要不然系统会一直寻找到0后才结束
  24. fileBuffer[fileLength]=0;
  25. //关闭文件
  26. fclose(file);
  27. qDebug()<<fileLength;
  28. //设置采样格式
  29. QAudioFormat audioFormat;
  30. //设置采样率
  31. audioFormat.setSampleRate(44100);
  32. //设置通道数
  33. audioFormat.setChannelCount(2);
  34. //设置采样大小,一般为8位或16位
  35. audioFormat.setSampleSize(16);
  36. //设置编码方式
  37. audioFormat.setCodec("audio/pcm");
  38. //设置字节序
  39. audioFormat.setByteOrder(QAudioFormat::LittleEndian);
  40. //设置样本数据类型
  41. audioFormat.setSampleType(QAudioFormat::UnSignedInt);
  42. //音频设备信息
  43. QAudioDeviceInfo info = QAudioDeviceInfo::defaultOutputDevice();
  44. if (!info.isFormatSupported(audioFormat)) {
  45. qDebug()<<"default format not supported try to use nearest";
  46. audioFormat = info.nearestFormat(audioFormat);
  47. }
  48. audioOutput = new QAudioOutput(audioFormat, this);
  49. streamOut = audioOutput->start();
  50. //定时器
  51. timer=new QTimer(this);
  52. connect(timer, SIGNAL(timeout()), SLOT(slotTimeout()));
  53. }

[cpp] view
plain
 copy

  1. void Widget::slotTimeout()
  2. {
  3. static int i=0;
  4. if(i<fileLength/1764)
  5. {
  6. tempBuffer.append(fileBuffer+i*1764,1764);
  7. if(audioOutput&&audioOutput->state()!=QAudio::StoppedState&&
  8. audioOutput->state()!=QAudio::SuspendedState)
  9. {
  10. int chunks = audioOutput->bytesFree()/audioOutput->periodSize();
  11. while (chunks)
  12. {
  13. if (tempBuffer.length() >= audioOutput->periodSize())
  14. {
  15. //写入到扬声器
  16. streamOut->write(tempBuffer.data(),audioOutput->periodSize());
  17. tempBuffer = tempBuffer.mid(audioOutput->periodSize());
  18. }
  19. else
  20. {
  21. //写入到扬声器
  22. streamOut->write(tempBuffer);
  23. tempBuffer.clear();
  24. break;
  25. }
  26. --chunks;
  27. }
  28. }
  29. }
  30. i++;
  31. }

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的评论

时间: 2024-07-29 00:28:52

Qt 播放音频文件的相关文章

Android 使用系统的Activity播放音频文件 intent

Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/sdcard/record.wav")), "audio"); startActivity(intent); 这里可以播放wav.amr.MP3等

ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件

原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class="MapClient.PicMusic" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx

Unity 播放音频文件

Unity 播放音频文件参考代码: 1 public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = false, float fPerTime = 1f) 2 { 3 if (!strSoundName.Equals("")) 4 { 5 //设置背景音乐 6 AudioClip clip = Resources.Load<AudioClip>(strSoundName); 7

关于Window Server2008 服务器上无法播放音频文件的解决方案

在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇到此类问题,可按照我的方式处理: 若是3gp文件,在服务器IIS的MIME类型中直接添加扩展名为“.3gp” MIME类型为“video/3gpp” 若是mp4文件,在服务器IIS的MIME类型中直接添加扩展名为“.mp4” MIME类型为“video/mp4” 以此类推 此方法能彻底解决视频播放问

使用audio标签播放音频文件

HTML5定义了一个新的元素用来指定标准的方式来插入音频文件到web页面中:<audio>标签.使用audio标签可以控制音频的播放与停止,循环播放与播放次数设置,以及播放位置等等. 例如:<audio id="a"  preload="metadata"  src="flash/1.mp3"  controls = "controls"></audio> 使用audio标签播放音频文件

ios为了用户隐私安全,禁止自动播放音频文件的解决办法(微信端)

ios为了用户隐私安全,禁止自动播放音频文件 //通过参数给音频设置id和路径 utils = { playAudio: function (id, src) { var audio = $('#' + id); if (audio.attr('src') == undefined) { audio.attr('src', src); } //audio[0].play(); function audioAutoPlay() { audio[0].play(); document.addEven

C#调用mciSendString播放音频文件

mciSendString函数是一个WinAPI,主要用来向MCI(Media Control Interface)设备发送字符串命令. 一.函数的声明如下: private static extern long mciSendString( string command, //MCI命令字符串 string returnString, //存放反馈信息的缓冲区 int returnSize, //缓冲区的长度 IntPtr hwndCallback //回调窗口的句柄,一般为NULL ); 二

linux dsp 播放音频文件

#include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/ioctl.h> #include <stdlib.h> #include <stdio.h> #include <linux/soundcard.h> /* 下面的三个参数是跟具体文件相关 * cmd: file 音频文件 * [file pass.wav] =>&

VC++中MCI播放音频文件 【转】

MCI播放mp3音频文件例程 源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.lib.或添加代码#pragma   comment(lib, "winmm.lib") MCI_OPEN_PARMS op; void CMCIDlg::OnPlay() {  // TODO: Add your control notification handler code