基于Qt/C++的音频转换程序,pcm互转wav,位数转换

话不多说,先上程序,上面是文件路径选择, 中间三个功能模块,最下面是个状态显示窗口,替换了cmd小黑窗,用起来相当丝滑

  • 直接选择文件夹,写了个文件过滤,可以一键转换文件夹下所有pcm/wav文件

在这里插入图片描述

上代码

一、ui设计

脑子里先想好,设计出来的程序大概什么样,然后在Qt的GUI里面设计出来,大概就这样子

在这里插入图片描述

二、定义类

ui里设计好模块,再根据模块设计分别实现的类,也可以先手画一下类之间的关系;
我这里刚好是三个类对应三个功能,然后再加一个主界面,感觉也不需要什么菜单栏,状态栏,一个widget就满足我的需求了

在这里插入图片描述

三、类实现

pcm2wav.cpp

这里具体实现就是在pcm裸数据,加上一个44字节的wav头
我这里直接搞了一个函数实现,方便其他程序调用pcm2WavFile(QString pathWav,QString pathPcm,const int NumChannels,const int SampleRate,const int BitsPerSample )
记得python里面有个wave的包,直接调用就可以,无奈苦逼c++还得手撸

#include "pcm2wav.h"
#include <iostream>
#include <string.h>
#include <fstream>
#include <QString>
#include <QFileInfo>
#include <QDebug>

using namespace std;
pcm2wav::pcm2wav(QObject *parent) : QObject(parent)
{

}

//参数:wav文件路径、pcm文件路径、声道数、采样率、位数
void pcm2wav::pcm2WavFile(QString pathWav,QString pathPcm,const int NumChannels,const int SampleRate,const int BitsPerSample )
{       
        // 准备文件
        QFileInfo fi;
        fi = QFileInfo(pathPcm);
        QString fiName = fi.fileName();
        // const int NumChannels = 1; //通道数,
        // const int SampleRate = 16000; //采样率
        // const int BitsPerSample = 24; //每个采样点的bit数,一般为8,16,32等
        QString wavPCM = pathWav+fiName.left(fiName.size()-3)+"wav";//设置wav的文件名
        ifstream pcmIn(qPrintable(pathPcm), ios::in|ios::binary);
        ofstream wavOut(qPrintable(wavPCM),ios::out | ios::binary);
        if(!wavOut.is_open())
        {
            cout<<"open wavfile erro"<<endl;
            return ;
        }
        if(!pcmIn.is_open())
        {
            cout<<"open pcmfile erro"<<endl;
            return ;
        }

        WAVE_HEADER pcmHEADER;
        WAVE_FMT    pcmFMT;
        WAVE_DATA   pcmDATA;

         // 1. /* WAVE_HEADER */
        //获取文件尺寸
        pcmIn.seekg(0,ios::end);
        unsigned long pcmSize = pcmIn.tellg();
        pcmHEADER.ChunkSize = 36 + pcmSize;

        memcpy(pcmHEADER.ChunkID, "RIFF", strlen("RIFF"));
        memcpy(pcmHEADER.Format, "WAVE", strlen("WAVE"));
        wavOut.write((char*)&pcmHEADER,sizeof(WAVE_HEADER));

        //2.  /* WAVE_FMT */
        memcpy(pcmFMT.Subchunk1ID, "fmt ", strlen("fmt "));
        pcmFMT.Subchunk1Size = 16;
        pcmFMT.AudioFormat = 1;
        pcmFMT.NumChannels = NumChannels;
        pcmFMT.SampleRate = SampleRate;
        pcmFMT.BitsPerSample = BitsPerSample;
        pcmFMT.ByteRate = pcmFMT.SampleRate*pcmFMT.NumChannels*pcmFMT.BitsPerSample/8;
        pcmFMT.BlockAlign = pcmFMT.NumChannels*pcmFMT.BitsPerSample/8;
        wavOut.write((char*)&pcmFMT,sizeof(WAVE_FMT));

        //3. /* WAVE_DATA */
        memcpy(pcmDATA.Subchunk2ID, "data", strlen("data"));
        pcmDATA.Subchunk2Size = pcmSize;
        wavOut.write((char*)&pcmDATA,sizeof(WAVE_DATA));

        //4. //数据拷贝
        char *temp= new char[pcmSize];
        pcmIn.seekg(0,ios::beg);
        pcmIn.read(temp, pcmSize);
        wavOut.write(temp, pcmSize);
        delete temp;
        pcmIn.close();
        wavOut.close();
}

wav2pcm.cpp

直接删掉文件头

#ifndef WAV2PCM_H
#define WAV2PCM_H

#include <QObject>

class wav2pcm : public QObject
{
    Q_OBJECT
public:
    explicit wav2pcm(QObject *parent = nullptr);
    void wav2pcmFiles(QString pathWav,QString pathPcm,int waveSize);
signals:

public slots:
};

#endif // WAV2PCM_H

audiobitconv.h

#ifndef AUDIOBITCONV_H
#define AUDIOBITCONV_H

#include <QObject>

class audioBitConv : public QObject
{
    Q_OBJECT
public:
    explicit audioBitConv(QObject *parent = nullptr);

    void bitConverFiles(QString,QString,int,int);
signals:

public slots:
};

#endif // AUDIOBITCONV_H

audiobitconv.cpp

#include "audiobitconv.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include <QFileInfo>
#define N 44
using namespace std;

audioBitConv::audioBitConv(QObject *parent) : QObject(parent)
{

}
void audioBitConv::bitConverFiles(QString initBitPcm,QString _converbitpcm,
                                  int initBit,int conveBit)
{
    QFileInfo fi;
    fi = QFileInfo(initBitPcm);
    QString fiName = fi.fileName();
    QString converBitPcm = _converbitpcm+fiName.left(fiName.size()-4)+QString::number(conveBit)+".pcm";
    //24位PCM转为量化电平读入内存v1
      ifstream bit24PcmIn(qPrintable(initBitPcm),ios::in| ios::binary);
      if(!bit24PcmIn.is_open())
      {
          cout<<"open 24file erro"<<endl;
          return  ;
      }
      vector<int>v1;
      while (!bit24PcmIn.eof())
      {
          int temp;
          bit24PcmIn.read((char*)&temp,initBit/8);
          v1.push_back(temp);
      }
      v1.pop_back();
      bit24PcmIn.close();

      // 高位电平转低位,二进制存盘
		.......待续

}



还没写完。。。
需要用,可先下载https://download.csdn.net/download/db1403600882/34039836

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 实现基于Qt/C的音频转换程序可以使用Qt的多媒体框架和音频处理库。具体步骤如下: 1. 首先,选择Qt的多媒体框架,以便处理音频文件。可以在Qt Creator中创建一个基于Qt的桌面应用程序项目。 2. 在Qt的项目中引入Qt Multimedia库,该库提供了对音频的处理功能。可以通过在.pro文件中添加`QT += multimedia`来引入该库。 3. 在Qt的项目中创建一个界面,用于用户选择待转换音频文件转换参数。可以使用Qt的UI设计器来创建用户界面,例如添加文件选择按钮和转换按钮。 4. 当用户点击转换按钮时,程序将执行音频转换的操作。在转换操作中,首先需要读取待转换音频文件。 5. 若要实现PCMWAV转换,需要将PCM音频数据封装为WAV文件格式。使用Qt的QAudioFormat类来设置WAV格式的音频参数,例如采样率、位深度等。 6. 创建一个QFile对象并打开一个.wave文件,在文件中写入WAV文件头部信息。 7. 读取PCM音频数据,并根据WAV音频参数将数据写入.wave文件。 8. 如果需要实现WAVPCM转换,可以使用Qt的QAudioDecoder类来解码WAV文件,提取出PCM数据。 9. 在PCM互转WAV位数转换的情况下,可以使用Qt的QAudioConverter类来实现。 10. 最后,将转换后的音频文件保存到指定位置。 以上就是基于Qt/C的音频转换程序的实现步骤。通过以上方法,可以轻松地实现PCMWAV文件的互相转换位数转换。 ### 回答2: 基于QT/C的音频转换程序可以实现PCM格式音频文件WAV格式音频文件的互相转换位数转换PCM(脉冲编码调制)是一种无压缩的音频编码格式,它将模拟音频信号数字化,采样率和位深度可以自定义。WAV是一种开放的音频文件格式,常用于存储无压缩的音频数据。PCM转换WAV格式可以使音频文件能够在各种播放器和设备中播放。 首先,程序需要读取PCM格式音频文件,并解析其采样率、位深度等参数。这些参数将在转换过程中用于重构WAV文件头。 接下来,程序根据WAV格式的规范,创建一个新的WAV文件,并将PCM音频数据写入。同时,需要根据PCM音频数据的位深度,进行相应的位数转换。例如,将16位的PCM音频数据转换为8位的WAV音频数据。 转换完成后,程序会保存新生成的WAV文件,该文件可以被各种音频播放器或设备直接播放。 同样地,该音频转换程序也可以将WAV格式音频文件转换PCM格式。程序会读取WAV文件的文件头信息,并解析其中的采样率、位深度等参数。然后,程序WAV文件中的音频数据进行位数转换,并写入一个新的PCM文件。 通过该基于QT/C的音频转换程序,我们可以方便地将PCM格式音频文件WAV格式音频文件进行互相转换,同时实现位数转换。这样,我们就可以根据实际需求,对音频文件进行灵活的处理和使用。 ### 回答3: 基于Qt/C的音频转换程序可以实现PCMWAV互转,以及位数转换PCM是一种原始的音频格式,而WAV是一种常用的音频文件格式。 PCMWAV转换可以通过读取PCM文件的原始数据,然后添加WAV文件头部信息的方式实现。WAV文件头部包含了音频的采样率、位数、通道数等信息。程序可以根据用户选择的参数生成WAV文件头部,并将PCM数据和WAV头部写入新的WAV文件。 位数转换可以将16位的PCM数据转换为8位的PCM数据,或者将8位的PCM数据转换为16位的PCM数据。转换过程中,将每个采样数据的位数进行缩放或扩展即可。程序可以根据用户选择的目标位数PCM数据进行相应的位数转换,并将转换后的数据写入新的PCM文件或WAV文件。 在实现这个音频转换程序时,可以使用Qt音频相关类库,如QAudioFormat和QAudioOutput来处理音频数据的读取和写入,以及音频文件格式的解析和生成。同时,还可以利用Qt提供的界面框架来设计一个简洁易用的用户界面,让用户可以方便地选择要转换的文件和转换参数。 总的来说,基于Qt/C的音频转换程序可以实现PCMWAV互转位数转换功能,通过读取和处理音频数据,生成相应的音频文件。该程序可以提供一个用户友好的界面,让用户可以方便地操作和选择转换参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jubary

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

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

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

打赏作者

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

抵扣说明:

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

余额充值