博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享用于学习C++音频处理的代码示例
阅读量:6370 次
发布时间:2019-06-23

本文共 4190 字,大约阅读时间需要 13 分钟。

与《》为姊妹篇。

为了便于学习C++音频处理并研究音频算法,

俺写了一个适合初学者学习的小小框架。

麻雀虽小五脏俱全,仅仅考虑单通道处理。

采用Decoder and Encoder:dr_wav

https://github.com/mackron/dr_libs/blob/master/dr_wav.h 

关于wav格式的解析移步至:

http://soundfile.sapp.org/doc/WaveFormat/

 

个人习惯,采用int16的处理方式,也可以通过简单的修改,改为float类型。

 wav音频样本可以从维基百科上(https://en.wikipedia.org/wiki/WAV)下载。

注:少数wav格式不支持

 

Format Bitrate () 1 minute () Sample
11,025 Hz 16 bit PCM 176.4 1292
8,000 Hz 16 bit PCM 128 938
11,025 Hz 8 bit PCM 88.2 646
11,025 Hz  88.2 646
8,000 Hz 8 bit PCM 64 469
8,000 Hz µ-Law 64 469
11,025 Hz 4 bit  44.1 323
8,000 Hz 4 bit ADPCM 32 234
11,025 Hz GSM 06.10 18 132
8,000 Hz MP3 16 kbit/s 16 117
8,000 Hz GSM 06.10 13 103
8,000 Hz  SBC 12 kbit/s 12 88
8,000 Hz   9 66
8,000 Hz MP3 8 kbit/s 8 60
8,000 Hz Lernout & Hauspie  4.8 35

附带处理耗时计算,示例演示了一个简单的将音频前面一半静音处理,并简单注释了一下部分逻辑。

完整代码:

 

#include 
#include
#include
#include
#include
//采用https://github.com/mackron/dr_libs/blob/master/dr_wav.h 解码#define DR_WAV_IMPLEMENTATION#include "dr_wav.h"auto const epoch = clock();static double now(){ return (clock() - epoch);};template
static double bench(const FN &fn){ auto took = -now(); return (fn(), took + now()) / 1000;}//写wav文件void wavWrite_int16(char* filename, int16_t* buffer, int sampleRate, uint32_t totalSampleCount) { drwav_data_format format; format.container = drwav_container_riff; // <-- drwav_container_riff = normal WAV files, drwav_container_w64 = Sony Wave64. format.format = DR_WAVE_FORMAT_PCM; // <-- Any of the DR_WAVE_FORMAT_* codes. format.channels = 1; format.sampleRate = sampleRate; format.bitsPerSample = 16; drwav* pWav = drwav_open_file_write(filename, &format); if (pWav) { drwav_uint64 samplesWritten = drwav_write(pWav, totalSampleCount, buffer); drwav_uninit(pWav); } }//读取wav文件int16_t* wavRead_int16(char* filename, uint32_t* sampleRate, uint64_t *totalSampleCount) { unsigned int channels; int16_t* buffer = drwav_open_and_read_file_s16(filename, &channels, sampleRate, totalSampleCount); if (buffer == NULL) { printf("读取wav文件失败."); } //仅仅处理单通道音频 if (channels != 1) { drwav_free(buffer); buffer = NULL; *sampleRate = 0; *totalSampleCount = 0; } return buffer;}//分割路径函数void splitpath(const char* path, char* drv, char* dir, char* name, char* ext){ const char* end; const char* p; const char* s; if (path[0] && path[1] == ':') { if (drv) { *drv++ = *path++; *drv++ = *path++; *drv = '\0'; } } else if (drv) *drv = '\0'; for (end = path; *end && *end != ':';) end++; for (p = end; p > path && *--p != '\\' && *p != '/';) if (*p == '.') { end = p; break; } if (ext) for (s = end; (*ext = *s++);) ext++; for (p = end; p > path;) if (*--p == '\\' || *p == '/') { p++; break; } if (name) { for (s = p; s < end;) *name++ = *s++; *name = '\0'; } if (dir) { for (s = path; s < p;) *dir++ = *s++; *dir = '\0'; }}int main(int argc, char* argv[]){ std::cout << "Audio Processing " << std::endl; std::cout << "博客:http://cpuimage.cnblogs.com/" << std::endl; std::cout << "支持解析单通道wav格式." << std::endl; if (argc < 2) return -1; char* in_file = argv[1]; //音频采样率 uint32_t sampleRate = 0; //总音频采样数 uint64_t totalSampleCount = 0; int16_t* wavBuffer = NULL; double nLoadTime = bench([&] { wavBuffer = wavRead_int16(in_file, &sampleRate, &totalSampleCount); }); std::cout << " 加载耗时: " << int(nLoadTime * 1000) << " 毫秒" << std::endl; //如果加载成功 if (wavBuffer != NULL) { //将前面一般进行静音处理,直接置零即可 for (uint64_t i = 0; i < totalSampleCount / 2; i++) { wavBuffer[i] = 0; } } //保存结果 double nSaveTime = bench([&] { char drive[3]; char dir[256]; char fname[256]; char ext[256]; char out_file[1024]; splitpath(in_file, drive, dir, fname, ext); sprintf(out_file, "%s%s%s_out%s", drive, dir, fname, ext); wavWrite_int16(out_file, wavBuffer, sampleRate, totalSampleCount); }); std::cout << " 保存耗时: " << int(nSaveTime * 1000) << " 毫秒" << std::endl; if (wavBuffer) { free(wavBuffer); } getchar(); std::cout << "按任意键退出程序 \n" << std::endl; return 0;}

 

示例具体流程为:

加载wav(拖放wav文件到可执行文件上)->简单静音处理->保存wav

并对 加载,保存 这2个环节都进行了耗时计算并输出。

  

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 

gaozhihan@vip.qq.com

 

若此博文能帮到您,欢迎扫码小额赞助。

微信:  

 

 

支付宝: 

转载于:https://www.cnblogs.com/cpuimage/p/8278451.html

你可能感兴趣的文章
Facebook创始人马克·扎克伯格总结的创业三大黄金法则
查看>>
博科第六代FC获戴尔EMC、富士通、日立数据和NetApp拥戴
查看>>
秋色园QBlog技术原理解析:Module之页面基类设计(五)
查看>>
虚拟化天花板将近,后虚拟化时代如何应对?
查看>>
恶意网站可利用这个新漏洞拖垮Windows 7和8电脑
查看>>
MEMS传感器要闯过的三关
查看>>
天合光能提交美股退市请求 正式私有化
查看>>
区块链技术将如何适用于企业业务
查看>>
为了OCP英特尔拼了,一大波新科技正在路上
查看>>
前白宫反恐首席顾问:NSA可以破解圣贝纳迪恐怖份子所有的iPhone
查看>>
Java最小堆解决TopK问题
查看>>
100万的大数据人才缺口,谁来解决?
查看>>
商标转让和域名转让的区别是什么?
查看>>
《数值分析(原书第2版)》—— 1.1 二分法
查看>>
Instor公司发布一款免费的数据中心成本估算工具
查看>>
公交监控系统之弊须有人出来认头
查看>>
STiD推出两款UHF RFID标签,适用于航空航天、石油等行业
查看>>
注意五大问题,避免CRM低效问题
查看>>
物联网将如何塑造未来的网络
查看>>
大连应探索适合智慧城市建设运营模式
查看>>