winamp中这一部分是怎样做的? 请高手达人不吝指导,感谢!

解决方案 »

  1.   

    HI,看清了,要等那么久!图形窗体、自制OCX控件和和一大堆多媒体API。
    所标注的那一部分是怎么制作的?枕善居有VB源码,自己找一找。
      

  2.   


     音频波形图示..
      用VB应该很实现..看你用什么控件..如果有接口的话.... 否则用VB可能写不出来吧..
      

  3.   

    如果能拿到频域的数据就比较简单了,这时主要就是把频谱的某一频段以条形图的方式画出来,当然要以一定的帧速进行刷新。
    如果拿到的是解码后的PCM数据,则要先做FFT变换,把时域数据转到频域,然后用上面的方法画图。如果这两种数据都没法拿到那就没办法了。 Plainamp 是一个基于Winamp插件的开源播放器,楼主可以研究研究。http://plainamp.sourceforge.net/
      

  4.   

    先在一个PIC里面画一个渐变色Public Function DrawSpectrum(ByVal ID As Long)
    Static x As Long, H As Double, i As Long
    Dim fft(512) As Single
    Dim nDataSize As Long
    Dim PosL As Long, posR As Long, POS As Long
    Dim ScopeArray(30) As Long
    Dim tmpColor As Long
    Dim y As Long
    Dim lRslt As Long
    Dim SampleData(1024) As Long
    DoEvents
    Select Case ID
        Case 0  '柱形
        lRslt = BASS_ChannelGetData(TempChan, fft(0), BASS_DATA_FFT1024)
        If lRslt <> BASSFALSE And lRslt > BASSFALSE Then
           For i = 0 To 100
               Data2(i) = fft(i)
               If (Data2(i) + (Data2(i) * (i * 0.25))) * 40 > Data(i) Then
                   Data(i) = (Data2(i) + (Data2(i) * (i * 0.25))) * 40
               Else
                   Data(i) = Data(i) - 1
               End If
           Next
           R = 0: x = 0: picSpectrum.Cls
           For R = 0 To 100
               y = (Data(R) + Data(R + 1) + Data(R + 2) + Data(R + 3) + Data(R + 4) + Data(R + 5) + Data(R + 6) + Data(R + 7)) / 16
               If y > picSpectrum.ScaleHeight Then y = picSpectrum.ScaleHeight
               '-------------------Bar------------------
               StretchBlt picSpectrum.hdc, x, Round(picHt - y), 3, y, picBar.hdc, 0, (picHt - y), 3, y, vbSrcCopy
               '顶点
               If bolDelay(R) = 40 Then Data3(R) = Data3(R) - 1: bolStart(R) = True
               bolDelay(R) = bolDelay(R) + 1
               If Data3(R) = y Then bolDelay(R) = 0: bolStart(R) = False
               If Data3(R) > y And bolStart(R) Then bolDelay(R) = 40
               If Data3(R) < y Then Data3(R) = (y)
               If VisualShowTop = True Then '是否显示顶点
                   BitBlt picSpectrum.hdc, x, Round(picHt - Data3(R)), 3, 1, picPeak.hdc, 0, 0, vbSrcCopy
               End If
               R = R + 2 '整体宽度
               x = x + 4 '横向间距
           Next R
        End If
        Case 1 '无间距柱形
        lRslt = BASS_ChannelGetData(TempChan, fft(0), BASS_DATA_FFT1024)
        For i = 0 To 150
            Data2(i) = fft(i)
            If (Data2(i) + (Data2(i) * (i * 0.25))) * 40 > Data(i) Then
                Data(i) = (Data2(i) + (Data2(i) * (i * 0.25))) * 40
            Else
                Data(i) = Data(i) - 1
            End If
        Next
        R = 0: x = 0: picSpectrum.Cls
        For R = 0 To 150
            y = (Data(R) + Data(R + 1) + Data(R + 2) + Data(R + 3) + Data(R + 4) + Data(R + 5) + Data(R + 6) + Data(R + 7)) / 16
            If y > picSpectrum.ScaleHeight Then y = picSpectrum.ScaleHeight
            '-------------------Bar------------------
            StretchBlt picSpectrum.hdc, x, Round(picHt - y), 3, y, picBar.hdc, 0, (picHt - y), 3, y, vbSrcCopy
            '顶点
            If bolDelay(R) = 40 Then Data3(R) = Data3(R) - 1: bolStart(R) = True
            bolDelay(R) = bolDelay(R) + 1
            If Data3(R) = y Then bolDelay(R) = 0: bolStart(R) = False
            If Data3(R) > y And bolStart(R) Then bolDelay(R) = 40
            If Data3(R) < y Then Data3(R) = (y)
            If VisualShowTop = True Then '是否显示顶点
                BitBlt picSpectrum.hdc, x, Round(picHt - Data3(R)), 3, 1, picPeak.hdc, 0, 0, vbSrcCopy
            End If
            R = R + 2 '整体宽度
            x = x + 2 '横向间距
        Next R
        Case 2  '条形
            nDataSize = 1024
            Call BASS_ChannelGetData(TempChan, SampleData(0), nDataSize)
            DrawScope picSpectrum, vbWhite, vbRed, 0, picSpectrum.Height / 2 - 5, picSpectrum.Width, 10, TempChan, ScopeLeftOnlyEnd SelectEnd Function
      

  5.   

    先在一个PIC里面画一个渐变色Public Function DrawSpectrum(ByVal ID As Long)
    Static x As Long, H As Double, i As Long
    Dim fft(512) As Single
    Dim nDataSize As Long
    Dim PosL As Long, posR As Long, POS As Long
    Dim ScopeArray(30) As Long
    Dim tmpColor As Long
    Dim y As Long
    Dim lRslt As Long
    Dim SampleData(1024) As Long
    DoEvents
    Select Case ID
        Case 0  '柱形
        lRslt = BASS_ChannelGetData(TempChan, fft(0), BASS_DATA_FFT1024)
        If lRslt <> BASSFALSE And lRslt > BASSFALSE Then
           For i = 0 To 100
               Data2(i) = fft(i)
               If (Data2(i) + (Data2(i) * (i * 0.25))) * 40 > Data(i) Then
                   Data(i) = (Data2(i) + (Data2(i) * (i * 0.25))) * 40
               Else
                   Data(i) = Data(i) - 1
               End If
           Next
           R = 0: x = 0: picSpectrum.Cls
           For R = 0 To 100
               y = (Data(R) + Data(R + 1) + Data(R + 2) + Data(R + 3) + Data(R + 4) + Data(R + 5) + Data(R + 6) + Data(R + 7)) / 16
               If y > picSpectrum.ScaleHeight Then y = picSpectrum.ScaleHeight
               '-------------------Bar------------------
               StretchBlt picSpectrum.hdc, x, Round(picHt - y), 3, y, picBar.hdc, 0, (picHt - y), 3, y, vbSrcCopy
               '顶点
               If bolDelay(R) = 40 Then Data3(R) = Data3(R) - 1: bolStart(R) = True
               bolDelay(R) = bolDelay(R) + 1
               If Data3(R) = y Then bolDelay(R) = 0: bolStart(R) = False
               If Data3(R) > y And bolStart(R) Then bolDelay(R) = 40
               If Data3(R) < y Then Data3(R) = (y)
               If VisualShowTop = True Then '是否显示顶点
                   BitBlt picSpectrum.hdc, x, Round(picHt - Data3(R)), 3, 1, picPeak.hdc, 0, 0, vbSrcCopy
               End If
               R = R + 2 '整体宽度
               x = x + 4 '横向间距
           Next R
        End If
        Case 1 '无间距柱形
        lRslt = BASS_ChannelGetData(TempChan, fft(0), BASS_DATA_FFT1024)
        For i = 0 To 150
            Data2(i) = fft(i)
            If (Data2(i) + (Data2(i) * (i * 0.25))) * 40 > Data(i) Then
                Data(i) = (Data2(i) + (Data2(i) * (i * 0.25))) * 40
            Else
                Data(i) = Data(i) - 1
            End If
        Next
        R = 0: x = 0: picSpectrum.Cls
        For R = 0 To 150
            y = (Data(R) + Data(R + 1) + Data(R + 2) + Data(R + 3) + Data(R + 4) + Data(R + 5) + Data(R + 6) + Data(R + 7)) / 16
            If y > picSpectrum.ScaleHeight Then y = picSpectrum.ScaleHeight
            '-------------------Bar------------------
            StretchBlt picSpectrum.hdc, x, Round(picHt - y), 3, y, picBar.hdc, 0, (picHt - y), 3, y, vbSrcCopy
            '顶点
            If bolDelay(R) = 40 Then Data3(R) = Data3(R) - 1: bolStart(R) = True
            bolDelay(R) = bolDelay(R) + 1
            If Data3(R) = y Then bolDelay(R) = 0: bolStart(R) = False
            If Data3(R) > y And bolStart(R) Then bolDelay(R) = 40
            If Data3(R) < y Then Data3(R) = (y)
            If VisualShowTop = True Then '是否显示顶点
                BitBlt picSpectrum.hdc, x, Round(picHt - Data3(R)), 3, 1, picPeak.hdc, 0, 0, vbSrcCopy
            End If
            R = R + 2 '整体宽度
            x = x + 2 '横向间距
        Next R
        Case 2  '条形
            nDataSize = 1024
            Call BASS_ChannelGetData(TempChan, SampleData(0), nDataSize)
            DrawScope picSpectrum, vbWhite, vbRed, 0, picSpectrum.Height / 2 - 5, picSpectrum.Width, 10, TempChan, ScopeLeftOnlyEnd SelectEnd Function