音频波形绘制方法

    转载请注明出处

 

    音频波形绘制时,主要就是需要了解绘制原理。总的原则为:把多少个采样点绘制到多宽(像素)的界面上,此时绘制分2种情况:1 需要绘制的采样点数少于或等于显示宽度(像素),此时可以直接绘制;2 需要绘制的采样点数大于显示宽度(像素),此时涉及到抛弃些采样点,但不是简单从多少个采样点中取一个或多个,通过下面的代码,相信你能悟出其中的原理。

 

void CTransWaveShow::paintEvent(QPaintEvent *event)

{

         QPainter painter(this);  

         painter.setRenderHint(QPainter::Antialiasing);

 

         QColor hourColor(127, 0, 127);

        

         int h = height() / 2;

         painter.translate(0, h);

 

         QPen vPen;

         vPen.setColor(Qt::red);

         vPen.setWidth(1);

         painter.setPen(vPen);

         painter.drawLine(0, 0, width(), 0);

 

         if (!(m_AudioList.size() > 0))

         {

                   return;

         }

 

         vPen.setColor(Qt::green);

         painter.setPen(vPen);

         int x1 = 0, y1 = 0, x2 = 0, y2 = 0;

 

         int vPointStep = 1;

         int vDataSetp  = 1;

         if (m_AudioList.size() >= width())

         {

                   vPointStep = 1;

                   vDataSetp  = m_AudioList.size() / width();

         }

         else

         {

                   vPointStep = width() / m_AudioList.size();

                   vDataSetp  = 1;

         }

 

         int vDataIdx = 0;

         for (int i = 0; i < width(); )

         {

                   int vPlusVal = 0;

                   int vNegaVal = 0;

             for(int j = 0; j < vDataSetp; j ++)

                   {

                            int vIdx = vDataIdx * vDataSetp + j;

                            if (!(vIdx < m_AudioList.size()))

                            {

                                     break;

                            }

 

                            int vCurVal = (m_AudioList[vIdx] * h) / (65535 / 2);

                            if (vCurVal > 0)

                            {

                                     if (vCurVal > vPlusVal)

                                     {

                                               vPlusVal = vCurVal;

                                     }

                            }

                            else if (vCurVal < 0)

                            {

                                     if (vCurVal < vNegaVal)

                                     {

                                               vNegaVal = vCurVal;

                                     }

                            }

                   }

 

                   if (vPlusVal > 0)

                   {

                            x2 = i;

                            y2 = - vPlusVal;

                            painter.drawLine(x1, y1, x2, y2);

                            x1 = x2;

                            y1 = y2;

                   }

                   if (vNegaVal < 0)

                   {

                            x2 = i;

                            y2 = - vNegaVal;

                            painter.drawLine(x1, y1, x2, y2);

                            x1 = x2;

                            y1 = y2;

                   }

 

                   i += vPointStep;

                   vDataIdx ++;

         }

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值