Qt播放PCM音频

       需要在.pro文件中加入multimedia模块,用到了QAudioOutput,先将PCM文件读取到内存,然后进行音频参数设置,最后从内存中定时读取部分数据,调用QIODevice的write函数将这部分数据写入到扬声器。

#include <QtCore/QCoreApplication>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QThread>
//如何准备pcm数据
//ffmpeg -i 1080.mp4 -f s16le out.pcm

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	//设置采样格式
	QAudioFormat fmt;
	fmt.setSampleRate(44100);   //设置采样率
	fmt.setChannelCount(2);     //设置通道数
	fmt.setSampleSize(16);      //设置采样大小
	fmt.setCodec("audio/pcm");  //设置编码方式
	fmt.setByteOrder(QAudioFormat::LittleEndian); //设置字节序
	fmt.setSampleType(QAudioFormat::UnSignedInt); //设置样本数据类型
	QAudioOutput *out = new QAudioOutput(fmt);
	QIODevice *io = out->start();  //开始播放

	//可运行的大小
	int size = out->periodSize();
	char *buf = new char[size];

	FILE *fp = fopen("out.pcm", "rb");
	while (!feof(fp))
	{
		if (out->bytesFree()<size)
		{
			QThread::msleep(1);
			continue;
		}
		int len = fread(buf,1,size,fp);
		if (len<=0)
		{
			break;
		}
		io->write(buf,len);
	}
	fclose(fp);
	delete buf;
	buf = 0;
	return a.exec();
}

 

Qt播放PCM音频,你可以使用QAudio类及其相关的子类。以下是一个基本的步骤: 1. **设置音频设备和格式**: 首先,你需要创建一个`QAudioDeviceInfo`对象,它代表系统的音频输入或输出设备。然后选择一个合适的音频格式,如QAudioFormat::Format_PCM_16Bit。 ```cpp QAudioDeviceInfo deviceInfo(QAudioDeviceInfo::defaultInputDevice()); QAudioFormat format; format.setSampleRate(44100); format.setChannelCount(2); // 双声道 format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleSize(16); ``` 2. **创建音频输出流**: 使用`QAudioOutput`类创建一个音频输出流,并将设备信息和格式设置到流中。 ```cpp QAudioOutput audioOutput(deviceInfo, format); if (!audioOutput.open(QIODevice::ReadOnly)) { qWarning() << "Failed to open audio output: " << audioOutput.errorString(); } ``` 3. **读取和播放PCM数据**: PCM数据通常存储在一个文件或者内存缓冲区中。你可以读取PCM数据并逐帧发送给音频输出流。 ```cpp QByteArray pcmData; // 假设已经从文件读取到pcmData audioOutput.start(); while (pcmData.size()) { qint64 bytesPlayed = audioOutput.write(pcmData.data(), pcmData.size()); if (bytesPlayed < 0) { qWarning() << "Error playing audio: " << audioOutput.errorString(); break; } pcmData.remove(0, bytesPlayed); } audioOutput.stop(); ``` 4. **处理错误和结束**: 在整个播放过程中,记得检查错误并正确关闭资源。 ```cpp audioOutput.close(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值