qt 音频播放开发

Qt播放音频文件的方法有好多中,简单介绍几种

不过一下几种方式都需要在Qt工程文件中添加

[cpp]  view plain  copy
  1. QT       += multimedia  


第一


QMediaPlayer类

可以播放MP3文件,同时使用也是最简单的了,具体代码

[cpp]  view plain  copy
  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. }  

该中实现方式适合单个文件的,如果有多个文件需要播放,那么需要使用下面的方式

[cpp]  view plain  copy
  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类


核心代码

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

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
根据引用和,您提到的是如何使用ffmpeg和Qt实现音频播放。根据引用,在之前的章节中,已经介绍了如何使用ffmpeg对视频进行解码和渲染,但忽略了音频数据。因此,本文将介绍如何使用ffmpeg解码音频,并制作一个音乐播放器。根据引用,该音乐播放器的特点是只解码音频数据,忽略视频图像数据,主要演示了ffmpeg的基本使用过程,包括如何解码音频数据、转换音频数据格式,并通过QAudioOutput进行播放。 根据引用,ffmpeg提供了一个例程来实现硬件解码,可以参考该例程来进行实现。您可以在ffmpeg的文档目录下找到该例程的代码文件,路径为ffmpeg\doc\examples\decode_audio.c。 因此,使用ffmpeg和Qt可以实现音频播放功能,您可以按照引用中的解码流程进行实现,包括解码音频数据、转换音频数据格式,并使用QAudioOutput进行播放。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [QT软件开发-基于FFMPEG设计视频播放器-解码音频(三)](https://blog.csdn.net/xiaolong1126626497/article/details/126836582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值