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 , 多媒体