当前位置:编程学习 > VB >>

winamp中这一部分是怎样做的?

winamp中这一部分是怎样做的? 请高手达人不吝指导,感谢! --------------------编程问答-------------------- 没有图像,看不清! --------------------编程问答-------------------- HI,看清了,要等那么久!图形窗体、自制OCX控件和和一大堆多媒体API。
所标注的那一部分是怎么制作的?枕善居有VB源码,自己找一找。
--------------------编程问答-------------------- 路过 --------------------编程问答-------------------- 不知道具体如何实现..........
  帮顶一下........ --------------------编程问答-------------------- 可以自己畫,但是不知道效率咋樣。 --------------------编程问答-------------------- 我觉得画倒是没什么难,不过怎么获得音乐频率我就不懂了。。。 --------------------编程问答--------------------
 音频波形图示..
  用VB应该很实现..看你用什么控件..如果有接口的话.... 否则用VB可能写不出来吧.. --------------------编程问答-------------------- 补充楼上的.. 应该是难在用VB获取音频流的..
图肯定不难 .. --------------------编程问答-------------------- 有点难度哦 --------------------编程问答-------------------- 如果能拿到频域的数据就比较简单了,这时主要就是把频谱的某一频段以条形图的方式画出来,当然要以一定的帧速进行刷新。
如果拿到的是解码后的PCM数据,则要先做FFT变换,把时域数据转到频域,然后用上面的方法画图。

如果这两种数据都没法拿到那就没办法了。

 Plainamp 是一个基于Winamp插件的开源播放器,楼主可以研究研究。

http://plainamp.sourceforge.net/ --------------------编程问答-------------------- 用BASS.DLL --------------------编程问答-------------------- 先在一个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, ScopeLeftOnly

End Select

End Function
--------------------编程问答-------------------- 先在一个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, ScopeLeftOnly

End Select

End Function
--------------------编程问答-------------------- 只能告诉你这么多了,这个就是画频谱的主要代码,效果和千千基本一样,渐变,顶点,就是没实现他的梦幻星空 --------------------编程问答-------------------- 看来大家都曾经对这个东西感过兴趣...
补充:VB ,  多媒体
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,