qt实现txt音频采样数据转pcm音频的代码,其中txt采样数据为16位深采样的10进制数
时间: 2024-12-14 15:18:27 浏览: 6
qt quick(qml)实现8bit和16bit的pcm的音频波形
在Qt中将TXT文本文件中的16位深度、10进制表示的音频采样数据转换为PCM音频,需要通过一些步骤来完成。以下是一个简化的示例,假设文本文件每一行代表一个采样点,数值范围是0-32767:
```cpp
#include <QFile>
#include <QDataStream>
#include <QAudioFormat>
#include <QAudioBuffer>
// 假设每条音频数据由两个整数组成,代表左声道和右声道
const int SampleSizeInBytes = sizeof(int) * 2;
void txtToPcm(const QString& inputFilePath, const QString& outputFilePath)
{
QFile inputFile(inputFilePath);
if (!inputFile.open(QIODevice::ReadOnly)) {
qWarning("Failed to open input file");
return;
}
QFile outputFile(outputFilePath, QIODevice::WriteOnly | QIODevice::Truncate);
if (!outputFile.open()) {
qWarning("Failed to open output file");
inputFile.close();
return;
}
QTextStream in(&inputFile);
QByteArray data;
while (!in.atEnd()) {
// 每次读取一行,解析成16位整数
qint32 sampleLeft, sampleRight;
in >> sampleLeft >> sampleRight; // 假定左右声道的数据在同一行
// 将样本转换为16位 PCM (Little Endian)
quint16 samplePair = ((quint16)sampleLeft << 8) | sampleRight;
data.append((char*)&samplePair); // 将16位打包到字节流中
}
inputFile.close();
QAudioFormat format;
format.setSampleRate(44100); // 常见采样率,可根据实际调整
format.setChannelCount(2); // 双声道
format.setSampleSize(16); // 16位深度
format.setByteOrder(QAudioFormat::LittleEndian);
QAudioBuffer audioBuffer(format);
audioBuffer.setData(data);
// 写入PCM音频文件
outputFile.write(audioBuffer.data(), audioBuffer.byteCount());
outputFile.close();
}
阅读全文