Qt实现pcm音频播放
·
qt实现pcm音频播放
文章目录
| 更多精彩内容 |
|---|
| 👉个人内容分类汇总 👈 |
方法一
- 在pro文件中添加multimedia模块
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QDebug>
#pragma execution_character_set("utf-8")
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("./out.pcm"); // 需要播放的音频
if (file.open(QIODevice::ReadOnly))
{
qDebug() << "打开成功!";
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
qDebug() << info.supportedSampleTypes(); // 输出支持的样本类型列表。
qDebug() << info.supportedByteOrders(); // 输出支持的字节顺序列表
qDebug() << info.supportedCodecs(); // 输出可用编码器
qDebug() << info.supportedSampleRates(); // 输出支持的采样率
QAudioFormat fmt;
fmt.setSampleRate(44100); // 设置采样率
fmt.setSampleSize(16); // 设置样本大小
fmt.setChannelCount(2); // 设置使用双通道
fmt.setCodec("audio/pcm"); // 设置编解码器
fmt.setByteOrder(QAudioFormat::LittleEndian); // 使用小端
fmt.setSampleType(QAudioFormat::UnSignedInt); //使用无符号整数样本类型(如果在linux下显示支持UnSignedInt,但是实际打开会失败,改用SignedInt就可以了)
if (!info.isFormatSupported(fmt))
{
qDebug() << "输出设备不支持该格式,不能播放音频";
return 0;
}
//QAudioOutput audio(fmt, qApp);
//audio.start(&file);
QAudioOutput* audio = new QAudioOutput(fmt, qApp); // 注意:这里QAudioOutput必须使用指针,否则不能播放
audio->start(&file);
delete audio;
audio = nullptr;
}
return a.exec();
}
方法二
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QDebug>
#include <QThread>
#pragma execution_character_set("utf-8")
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("./out.pcm");
if (file.open(QIODevice::ReadOnly))
{
qDebug() << "打开成功!";
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
qDebug() << info.supportedSampleTypes(); // 输出支持的样本类型列表。
qDebug() << info.supportedByteOrders(); // 输出支持的字节顺序列表
qDebug() << info.supportedCodecs(); // 输出可用编码器
qDebug() << info.supportedSampleRates(); // 输出支持的采样率
QAudioFormat fmt;
fmt.setSampleRate(44100); // 设置采样率
fmt.setSampleSize(16); // 设置样本大小
fmt.setChannelCount(2); // 设置使用双通道
fmt.setCodec("audio/pcm"); // 设置编解码器
fmt.setByteOrder(QAudioFormat::LittleEndian); // 使用小端
fmt.setSampleType(QAudioFormat::UnSignedInt); // 使用无符号整数样本类型
if (!info.isFormatSupported(fmt))
{
qDebug() << "输出设备不支持该格式,不能播放音频";
return 0;
}
QAudioOutput* audio = new QAudioOutput(fmt, qApp); // 注意:这里QAudioOutput必须使用指针,否则不能播放
QIODevice* io = audio->start();
int size = audio->periodSize(); // 这是每个周期防止缓冲区欠载和确保不间断播放所需的数据量。
QByteArray buf = file.readAll(); // 将需要播放的音频数据读到buf中
file.close();
while (!buf.isEmpty())
{
if (audio->bytesFree() < size) // 音频缓冲区中可用的空闲字节数,判断缓冲区是否可写入数据。
{
QThread::msleep(1);
continue;
}
io->write(buf.mid(0, size)); // 写入需要播放的数据
buf.remove(0, size);
qDebug() << buf.count();
}
io->close();
delete io;
io = nullptr;
}
return a.exec();
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)