【QT】将处理后的音频文件保存到本地

目录

前言

一、MATLAB环境

二、QT环境

1.定义函数

2.调用函数

总结



前言

输出音频文件到本地常常基于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);


总结

通过上述方法,即可完成对于音频文件的输出,供诸位进行参考!

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将MySQL链表保存到本地Excel,可以使用Qt的QSqlQuery类来查询数据库,并将结果保存为CSV格式的文件。然后,可以使用QtQTextStream类读取CSV文件,并将数据保存到本地Excel文件。 下面是一个简单的示例代码: ```cpp #include <QCoreApplication> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlRecord> #include <QFile> #include <QTextStream> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 连接MySQL数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("mydatabase"); db.setUserName("myusername"); db.setPassword("mypassword"); if (!db.open()) { qDebug() << "Failed to connect to database."; return 1; } // 查询数据 QSqlQuery query("SELECT * FROM mytable"); QSqlRecord record = query.record(); // 保存为CSV文件 QFile file("output.csv"); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); // 写入表头 for (int i = 0; i < record.count(); i++) { out << record.fieldName(i) << ","; } out << "\n"; // 写入数据 while (query.next()) { for (int i = 0; i < record.count(); i++) { out << query.value(i).toString() << ","; } out << "\n"; } file.close(); } // 保存为Excel文件 QFile csvFile("output.csv"); if (csvFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&csvFile); QFile excelFile("output.xlsx"); if (excelFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QTextStream out(&excelFile); // 写入BOM out.setCodec("UTF-8"); out << "\xEF\xBB\xBF"; // 写入数据 while (!in.atEnd()) { QString line = in.readLine(); QStringList fields = line.split(","); for (int i = 0; i < fields.count(); i++) { QString field = fields[i]; // 处理特殊字符 field.replace("\"", "\"\""); if (field.contains(",") || field.contains("\"") || field.contains("\n")) { field = "\"" + field + "\""; } out << field; if (i < fields.count() - 1) { out << ","; } } out << "\n"; } excelFile.close(); } csvFile.close(); } // 关闭数据库连接 db.close(); return 0; } ``` 这个示例代码将MySQL数据库的数据保存为CSV文件,然后将CSV文件保存为Excel文件。在保存为Excel文件时,需要注意特殊字符的处理,例如逗号、双引号和换行符等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺碎冰冰!!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值