概述
项目背景:Linux下,通过麦克风采集音频,实时显示出音频的波形。
参考文章:
- 调用CImg库显示WAV格式音频波形_aoya9772的博客-CSDN博客
- CImg库快速学习笔记_千灵域的博客-CSDN博客_cimg使用 (CImg 基本语法)
- git:https://github.com/dtschump/CImg (examples中有很多实现demo)
代码实现:
由于网上实现的都是读取一个音频文件,然后绘制出音频波形,但我需要实时来显示采集到的音频,所以参考了原作者文章,稍微改造了一下。
#include <iostream>
#include "wavfile.h"
#include "CImg.h"
#include <vector>
using namespace std;
using namespace cimg_library;
using namespace AudioUtils;
int main(void)
{
std::vector<float> vec;
WaveFile *wf = new WaveFile();
/*
读取本目录里的audio.wav文件,并生成波形
*/
wf->readwav("333.wav");
int datalength = wf->size() / wf->bit();
wf->output_WAVfile_info();
/*
调用CImg显示波形
*/
const unsigned char red[] = {255, 0, 0}, yellow[] = {0 ,139 ,0},
green[] = {75, 243, 167};
CImgDisplay main_disp_wav(1000, 300, "signal");
main_disp_wav.move(100, 100);
int num = wf->size() / (8 * (wf->bit()));
int k = 0;
int is_show = 0;
int *data = (int *)malloc(sizeof(int) * datalength);
for (int i = 0; i < datalength; i++)
{
data[i] = (float)(wf->data[i] / 100);
if (i > 0 && (i + 1) % 16000 == 0)
{
for (int j = 0; j < 2000; j++)
{
vec.push_back((data[k * 8]) * 100);
k++;
}
if (vec.size() > 120000)
{
vec.erase(vec.begin(), vec.begin() + 2000);
}
CImg<unsigned char> signal_visu = CImg<unsigned char>(1000, 300, 1, 3, 0);
signal_visu.draw_grid(40, 50, 0, 0, 0, 0, yellow, 0.5);
CImg<float> signal_wav = CImg<float>(120000, 1, 1, 1, 0);
for (size_t i = 0; i < vec.size(); i++)
{
signal_wav[i] = vec[i];
}
signal_visu.draw_graph(signal_wav, green, 1, 3, 1, 35000, -35000, 0);
main_disp_wav.display(signal_visu);
}
}
getchar();
return 0;
}
说明:
- 读取音频文件,然后将音频分成N个一秒的音频片段,从而来模拟实时绘制音频波形。
- 设置音频显示最大长度,这里我设置60秒,也就是显示第61秒的视频时,将第一秒的音频信息删除,以此类推。
- 代码中,前提假设是16k,16bit,单声道的音频,所以实际应用到项目中,需根据音频实际信息计算波形长度等阈值。
- 关于音频读取代码,参考下原作者的实现,不是我写的,就不贴了。
- 参考了下Windows的音频波形显示,修改了下样式,感觉更美丽动人了,哈哈。
实现效果:
END:
- 有啥问题,请楼下集合...
Demo: Linux下,基于CImg实现实时绘制音频波形-互联网文档类资源-CSDN下载
最后
以上就是强健楼房为你收集整理的Linux下,基于CImg 实现音频波形实时显示(样式很beautiful)的全部内容,希望文章能够帮你解决Linux下,基于CImg 实现音频波形实时显示(样式很beautiful)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复