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函数将这部分数据写入到扬声器。与方法一相比,方法二虽然麻烦,但是这种方法是进行语音编解码和语音网络传输的基础。
方法一:
-
#include <QApplication>
-
#include <QFile>
-
#include <QAudioFormat>
-
#include <QAudioOutput>
-
-
int main(int argc, char *argv[])
-
{
-
QApplication a(argc, argv);
-
QFile inputFile;
-
inputFile.setFileName("test.pcm");
-
inputFile.open(QIODevice::ReadOnly);
-
-
-
QAudioFormat audioFormat;
-
-
audioFormat.setSampleRate(44100);
-
-
audioFormat.setChannelCount(2);
-
-
audioFormat.setSampleSize(16);
-
-
audioFormat.setCodec("audio/pcm");
-
-
audioFormat.setByteOrder(QAudioFormat::LittleEndian);
-
-
audioFormat.setSampleType(QAudioFormat::UnSignedInt);
-
-
QAudioOutput *audio = new QAudioOutput( audioFormat, 0);
-
audio->start(&inputFile);
-
return a.exec();
-
}
方法二:
-
Widget::Widget(QWidget *parent) :
-
QWidget(parent),
-
ui(new Ui::Widget)
-
{
-
ui->setupUi(this);
-
-
-
FILE *file=fopen("test.pcm","rb");
-
if(!file)
-
{
-
qDebug()<<"Open Failed";
-
return;
-
}
-
-
fseek(file,0,SEEK_END);
-
-
fileLength=ftell(file);
-
-
fileBuffer=new char[fileLength+1];
-
-
rewind(file);
-
-
fread(fileBuffer,1,fileLength,file);
-
-
fileBuffer[fileLength]=0;
-
-
fclose(file);
-
qDebug()<<fileLength;
-
-
-
QAudioFormat audioFormat;
-
-
audioFormat.setSampleRate(44100);
-
-
audioFormat.setChannelCount(2);
-
-
audioFormat.setSampleSize(16);
-
-
audioFormat.setCodec("audio/pcm");
-
-
audioFormat.setByteOrder(QAudioFormat::LittleEndian);
-
-
audioFormat.setSampleType(QAudioFormat::UnSignedInt);
-
-
QAudioDeviceInfo info = QAudioDeviceInfo::defaultOutputDevice();
-
if (!info.isFormatSupported(audioFormat)) {
-
qDebug()<<"default format not supported try to use nearest";
-
audioFormat = info.nearestFormat(audioFormat);
-
}
-
audioOutput = new QAudioOutput(audioFormat, this);
-
streamOut = audioOutput->start();
-
-
timer=new QTimer(this);
-
connect(timer, SIGNAL(timeout()), SLOT(slotTimeout()));
-
}
-
void Widget::slotTimeout()
-
{
-
static int i=0;
-
if(i<fileLength/1764)
-
{
-
tempBuffer.append(fileBuffer+i*1764,1764);
-
-
if(audioOutput&&audioOutput->state()!=QAudio::StoppedState&&
-
audioOutput->state()!=QAudio::SuspendedState)
-
{
-
int chunks = audioOutput->bytesFree()/audioOutput->periodSize();
-
while (chunks)
-
{
-
if (tempBuffer.length() >= audioOutput->periodSize())
-
{
-
-
streamOut->write(tempBuffer.data(),audioOutput->periodSize());
-
tempBuffer = tempBuffer.mid(audioOutput->periodSize());
-
}
-
else
-
{
-
-
streamOut->write(tempBuffer);
-
tempBuffer.clear();
-
break;
-
}
-
--chunks;
-
}
-
}
-
}
-
i++;
-
}
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的评论
来源:https://www.cnblogs.com/DreamDog/p/9160136.html