话不多说,先上程序,上面是文件路径选择, 中间三个功能模块,最下面是个状态显示窗口,替换了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转为量化电平读入内存v1ifstream 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

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

  1. Qt录制音频为pcm并进行ffmpeg aac编码

      Qt提供了音频采集功能,主要涉及到3个类,QAudioFormat,QAudioInput,QIODevice.   在进行音频采集时先用QAudioFormat设置采集参数,然后创建音频输入对象 ...

  2. 基于Qt语音识别功能

    基于在最近的研究Qt语音识别平台下.在此记录12 首先,语音识别做三件事 1.记录用户的语音文件到本地 2.将用户语音编码 使用flac或者speex进行编码 3.使用第三方语音识别API或者SDK进 ...

  3. 基于Qt的笛卡尔心形表白程序

    基于Qt的笛卡尔心形表白程序 1.基本介绍 2.笛卡尔心形函数 3.QCustomPlot 4.功能介绍 1.ui界面 2.控件说明 5.程序说明 1.初始化设计 2.槽函数设计 1.按钮 2.滑动条 ...

  4. 基于Qt的音乐播放器(二)切换歌曲,调节音量,调节语速,暂停

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.切换歌曲 2.调节音量 3.调节语速 4.播放/暂停 5.我们来看下效果 6.关于上一篇提 ...

  5. 最简单的基于FFMPEG+SDL的音频播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  6. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  7. 嵌入式项目实战——基于QT的视频监控系统设计(二)

    嵌入式项目实战--基于QT的视频监控系统设计(二) 昨天我分享了关于QT的基本使用方法,掌握了这些基本的方法就可以设计一个简单的视频监控界面.下面我们开始分享完成这个嵌入式项目同样重要的知识点--UD ...

  8. 基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.效果图 2.准备好前面获取的酷狗api接口 3.网络歌曲搜索实现 4.网络歌曲播放的实现 ...

  9. 基于QT的网络视频会议系统---KNVM

    本文来自http://blog.csdn.net/slientman原创,引用必须注明出处! KNVM网络视频会议系统V1.0 经过2年艰苦细致的开发,终于完成了基于QT的网络视频会议系统,特此记录, ...

最新文章

  1. snagit屏幕截图转pdf
  2. 一不小心就踩了lombok的坑?
  3. 【原创】再见,CVT----记搓人的第一次找实习
  4. 数据库不推荐使用外键的9个理由!
  5. for循环中new的对象什么时候被回收_你真的了解JS里的 new 吗?
  6. C语言中assert()断言函数的概念及用法
  7. SAP CRM IBASE在ABAP update task中实现update和delete操作
  8. java jni开发_Java JNI开发实践记录
  9. android图片查看器,实现图片加载进度监听,实现保存图片
  10. http请求头中Referer的作用及危害
  11. 【Nexus3】使用-Nexus3批量上传jar包 artifact upload
  12. laravel报错:MassAssignmentException
  13. 【Java每日一题】20170110
  14. scala写入mysql_spark rdd转dataframe 写入mysql的实例讲解
  15. linux系统上不去网,linux 上不去网
  16. U盘做启动盘后,如何恢复原始容量
  17. 微信小程序获取手机号(Java后台实现)
  18. Android图片拼接
  19. mindspore详解
  20. 上海亚商投顾:沪指低开高走 锂矿股午后大涨

热门文章

  1. DataBinding的使用之双向绑定
  2. java中数组下标越界的异常_java新手求助 数组下标越界异常
  3. Java基础知识学完了,还在看着控制台上输出的结果发呆吗?还不来认识认识GUI编程(初识GUI)
  4. commander入门教程及高级用法
  5. 中国移动业务支撑系统简介(BOSS、BASS、BOMC、4A及VGOP)
  6. Mathematics Subject Classification (MSC)
  7. 读书笔记---《如何高效学习》
  8. 云存储架构的技术特点与三个发展方向
  9. Google GWT
  10. 基于simulink的PID控制器设计