项目背景:Linux下,通过麦克风采集音频,实时显示出音频的波形。
参考文章:
- 调用CImg库显示WAV格式音频波形_aoya9772的博客-CSDN博客
- CImg库快速学习笔记_千灵域的博客-CSDN博客_cimg使用 (CImg 基本语法)
- git:https://github.com/dtschump/CImg (examples中有很多实现demo)
代码实现:
由于网上实现的都是读取一个音频文件,然后绘制出音频波形,但我需要实时来显示采集到的音频,所以参考了原作者文章,稍微改造了一下。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77#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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复