目录
前言
输出音频文件到本地常常基于MATLAB环境进行处理,且仅需一行代码就可以解决,最近准备将QT处理过后的音频文件输出到本地,通过查阅相关资料,问题得到解决。本文基于MATLAB和QT两种环境,对于如何将音频文件输出至本地路径进行详细介绍。
一、MATLAB环境
MATLAB环境下,仅需要audiowrite函数即可完成音频文件的输出,一行代码,非常简便。
//filename为保存文件的名字,如"audio.wav"
//y为需要保存的变量
//fs为采样率
audiowrite(filename,y,fs);
二、QT环境
1.定义函数
代码如下:
//形参分别为文件名、数据、采用率、数据点数
void write_audio(const char* filename, double* data, int sampleRate, int numSamples)
{
FILE* file = fopen(filename, "wb");
if (!file) {
qDebug() << "Failed to open file for writing: " << filename;
return;
}
int numChannels = 1;
int bitsPerSample = 16;
int bytesPerSample = bitsPerSample / 8;
int dataSize = numSamples * numChannels * bytesPerSample;
int totalSize = dataSize + 44;
fwrite("RIFF", 4, 1, file);
fwrite(&totalSize, sizeof(int), 1, file);
fwrite("WAVE", 4, 1, file);
fwrite("fmt ", 4, 1, file);
int fmtSize = 16;
fwrite(&fmtSize, sizeof(int), 1, file);
short audioFormat = 1;
fwrite(&audioFormat, sizeof(short), 1, file);
fwrite(&numChannels, sizeof(short), 1, file);
fwrite(&sampleRate, sizeof(int), 1, file);
int byteRate = sampleRate * numChannels * bytesPerSample;
fwrite(&byteRate, sizeof(int), 1, file);
short blockAlign = numChannels * bytesPerSample;
fwrite(&blockAlign, sizeof(short), 1, file);
fwrite(&bitsPerSample, sizeof(short), 1, file);
fwrite("data", 4, 1, file);
fwrite(&dataSize, sizeof(int), 1, file);
for (int i = 0; i < numSamples; i++) {
short sample = (short)(data[i] * 32767.0);
fwrite(&sample, sizeof(short), 1, file);
}
fclose(file);
}
2.调用函数
代码如下:
QString filename = QFileDialog::getSaveFileName(this, "Save Audio File", "", "WAV file (*.wav)");
if (filename.isEmpty()) {
return;
}
write_audio(filename.toStdString().c_str(), data, sampleRate, numSamples);
总结
通过上述方法,即可完成对于音频文件的输出,供诸位进行参考!