基于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转为量化电平读入内存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,位数转换相关推荐
- Qt录制音频为pcm并进行ffmpeg aac编码
Qt提供了音频采集功能,主要涉及到3个类,QAudioFormat,QAudioInput,QIODevice. 在进行音频采集时先用QAudioFormat设置采集参数,然后创建音频输入对象 ...
- 基于Qt语音识别功能
基于在最近的研究Qt语音识别平台下.在此记录12 首先,语音识别做三件事 1.记录用户的语音文件到本地 2.将用户语音编码 使用flac或者speex进行编码 3.使用第三方语音识别API或者SDK进 ...
- 基于Qt的笛卡尔心形表白程序
基于Qt的笛卡尔心形表白程序 1.基本介绍 2.笛卡尔心形函数 3.QCustomPlot 4.功能介绍 1.ui界面 2.控件说明 5.程序说明 1.初始化设计 2.槽函数设计 1.按钮 2.滑动条 ...
- 基于Qt的音乐播放器(二)切换歌曲,调节音量,调节语速,暂停
2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.切换歌曲 2.调节音量 3.调节语速 4.播放/暂停 5.我们来看下效果 6.关于上一篇提 ...
- 最简单的基于FFMPEG+SDL的音频播放器
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- 嵌入式项目实战——基于QT的视频监控系统设计(二)
嵌入式项目实战--基于QT的视频监控系统设计(二) 昨天我分享了关于QT的基本使用方法,掌握了这些基本的方法就可以设计一个简单的视频监控界面.下面我们开始分享完成这个嵌入式项目同样重要的知识点--UD ...
- 基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放
2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.效果图 2.准备好前面获取的酷狗api接口 3.网络歌曲搜索实现 4.网络歌曲播放的实现 ...
- 基于QT的网络视频会议系统---KNVM
本文来自http://blog.csdn.net/slientman原创,引用必须注明出处! KNVM网络视频会议系统V1.0 经过2年艰苦细致的开发,终于完成了基于QT的网络视频会议系统,特此记录, ...
最新文章
- snagit屏幕截图转pdf
- 一不小心就踩了lombok的坑?
- 【原创】再见,CVT----记搓人的第一次找实习
- 数据库不推荐使用外键的9个理由!
- for循环中new的对象什么时候被回收_你真的了解JS里的 new 吗?
- C语言中assert()断言函数的概念及用法
- SAP CRM IBASE在ABAP update task中实现update和delete操作
- java jni开发_Java JNI开发实践记录
- android图片查看器,实现图片加载进度监听,实现保存图片
- http请求头中Referer的作用及危害
- 【Nexus3】使用-Nexus3批量上传jar包 artifact upload
- laravel报错:MassAssignmentException
- 【Java每日一题】20170110
- scala写入mysql_spark rdd转dataframe 写入mysql的实例讲解
- linux系统上不去网,linux 上不去网
- U盘做启动盘后,如何恢复原始容量
- 微信小程序获取手机号(Java后台实现)
- Android图片拼接
- mindspore详解
- 上海亚商投顾:沪指低开高走 锂矿股午后大涨