Linux下,基于CImg 实现音频波形实时显示(样式很beautiful)

项目背景:Linux下,通过麦克风采集音频,实时显示出音频的波形。

参考文章:

  • https://blog.csdn.net/aoya9772/article/details/101828301
  • https://blog.csdn.net/u012837895/article/details/83188656 (CImg 基本语法)
  • git:https://github.com/dtschump/CImg  (examples中有很多实现demo)

代码实现:

由于网上实现的都是读取一个音频文件,然后绘制出音频波形,但我需要实时来显示采集到的音频,所以参考了原作者文章,稍微改造了一下。

#include 
#include "wavfile.h"
#include "CImg.h"
#include 
using namespace std;
using namespace cimg_library;
using namespace AudioUtils;

int main(void)
{

    std::vector 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 signal_visu = CImg(1000, 300, 1, 3, 0);
            signal_visu.draw_grid(40, 50, 0, 0, 0, 0, yellow, 0.5);

            CImg signal_wav = CImg(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;
}

说明:

  1. 读取音频文件,然后将音频分成N个一秒的音频片段,从而来模拟实时绘制音频波形。
  2. 设置音频显示最大长度,这里我设置60秒,也就是显示第61秒的视频时,将第一秒的音频信息删除,以此类推。
  3. 代码中,前提假设是16k,16bit,单声道的音频,所以实际应用到项目中,需根据音频实际信息计算波形长度等阈值。
  4. 关于音频读取代码,参考下原作者的实现,不是我写的,就不贴了。
  5. 参考了下Windows的音频波形显示,修改了下样式,感觉更美丽动人了,哈哈。

实现效果:

Linux下,基于CImg 实现音频波形实时显示(样式很beautiful)_第1张图片

END:

  • 有啥问题,请楼下集合...

 

Demo: https://download.csdn.net/download/haiyangyunbao813/12652224

 

代码免费,不用给我转钱。

Linux下,基于CImg 实现音频波形实时显示(样式很beautiful)_第2张图片

 

 

你可能感兴趣的:(其他)