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

用VB写个音乐播放器需要用到什么函数

用VB写个音乐播放器需要用到什么函数 --------------------编程问答-------------------- '添加Command1   CommonDialog1

'Mcisendstring很挑的,它不支持长路径, 路径名除了要先改为短路径之外,歌曲名也不能含有空格.

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
'**************************************************************************************
Dim songname$, appdisk$, aa$, oldsong$
Private Sub Form_Load()
     appdisk = getshortname(Trim(App.Path))
     If Right(appdisk, 1) <> "\" Then appdisk = appdisk & "\"
     Command1.Caption = "挑首曲子"
     oldsong = ""
End Sub

Private Sub Form_Unload(Cancel As Integer)
     Call stopmusic
     End
End Sub

Private Sub Command1_Click()
     CommonDialog1.Filter = "音乐文件|*.mp3;*.mid;*.wav;*.wma;*.rid"
     CommonDialog1.ShowOpen
     If CommonDialog1.FileName <> "" Then
        songname = getshortname(CommonDialog1.FileName)
        If InStr(CommonDialog1.FileTitle, " ") > 0 Then
           aa = appdisk & Replace(CommonDialog1.FileTitle, " ", "")
           FileCopy songname, aa
           songname = aa
        End If
        Call playmusic
     End If
End Sub

Public Sub stopmusic()
     mciSendString "stop " & oldsong, vbNullString, 0, 0
     mciSendString "close " & oldsong, vbNullString, 0, 0
End Sub

Public Sub playmusic()
     On Error Resume Next
     Call stopmusic
     If Dir(songname) <> "" Then
        mciSendString "open " & songname & " type mpegvideo", vbNullString, 0, 0
        mciSendString "play " & songname & " repeat", vbNullString, 0, 0
        oldsong = songname
     End If
End Sub

Public Function getshortname(ByVal sLongFileName As String) As String
     Dim lRetVal As Long, sShortPathName As String, iLen As Integer
     sShortPathName = Space(255)
     iLen = Len(sShortPathName)
     lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
     getshortname = Left(sShortPathName, lRetVal)
End Function


--------------------编程问答-------------------- '这个是复杂点的, 请注意将列出的控件添加齐全

'给初学者学习如何使用Mediaplayer播放歌曲
'添加 Slider1  Mediaplayer1  Command1(0)  Command1(1)  Command1(2)
'添加 Commondialog1 Timer1
'工程部件添加Windows Media player 如在工程部件没有的话,可在System32找得到 msdxm.ocx

Dim songname$   '宣告全局变量
Private Sub Form_Activate()
    '窗体置于屏幕中间
    Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
    Timer1.Enabled = False '计时器停止
    Timer1.Interval = 500   '计时器的间隔500毫秒
    Command1(0).Caption = "播放"   '给Command1命名
    Command1(1).Caption = "停止"
    Command1(2).Caption = "选歌"
    songname = ""   '播放歌曲名清空
    Command1(0).Enabled = False    '让下面两个Command1不能用
    Command1(1).Enabled = False
End Sub

Private Sub Command1_Click(Index As Integer)
    On Error GoTo errhandler   '产生错误执行errhandler副程序
    Select Case Index '选择Command1按钮点击那一个
       Case 0
          playsong   '执行playsong副程序(代码在下面)
       Case 1
          MediaPlayer1.Stop '音乐停止
          Slider1.Value = 0 '滚动条归零
          Slider1.Enabled = False   '滚动条失效
          MediaPlayer1.SelectionStart = 0   '播放器归零
          Command1(0).Enabled = True '让Command1(0)可以使用
          Command1(1).Enabled = False '让Command1(1)不能用
       Case 2
          With CommonDialog1    '宣告CommonDialog1属性
             .CancelError = True   '接受CancelError
             .InitDir = App.Path   'Commondialog1的初始路径为当前路径
             '过滤扩展名为MP3,wav,wma...的文件
             .Filter = "【播放清单】MP3 Files(*.mp3)|*.mp3|Wave Filse(*.wav)|*.wav|(*.mid)|*.mid|(*.wma)|*.wma|(*.rm)|*.rm|(*.rmvb)|*.rmvb"
             .FileName = ""   '挑选文件名予设为空
             .ShowOpen   '.Action = 1 '设为打开
          End With
          If CommonDialog1.FileName <> "" Then   '如果在对话匡里选的文件名称不为空
             songname = UCase(Trim(CommonDialog1.FileName))   '将在对话匡里挑选的文件带入变量 songname
             Command1_Click (0)   '执行 command1(0) 播放
          End If
    End Select
errhandler:   '错误副程序, 上面点了取消会返回32755
    If Err > 0 Then
       Exit Sub   '退出本副程序
    End If
End Sub

Private Sub Timer1_Timer()
    Dim posx&   '宣告变量
    posx = MediaPlayer1.CurrentPosition   'posx是目前Mediaplayer1的播放位置
    Slider1.Value = posx   '让滚动条的值设为目前Mediaplayer1的播放位置
    If Slider1.Value >= Slider1.Max Then '如果目前滚动条的值大于让滚动条的最大值(歌曲已播完)
       Command1_Click (0)   '执行 command1(0) 再次重新播放
    End If
End Sub

Private Sub Slider1_Mouseup(Button As Integer, Shift As Integer, x As Single, y As Single)
    On Error Resume Next   '如有错误继续往下执行
    Dim startpos! '宣告变量
    If Slider1.Enabled Then   '如果滚动条有作用
       Timer1.Enabled = False '计时器停止
       MediaPlayer1.Stop   '停止播歌
       startpos = (x - 120) / (Slider1.Width - 240) * Slider1.Max '得知点击的位置
       Slider1.Value = CInt(startpos) '滚动条的位置=点击的位置
       MediaPlayer1.SelectionStart = Slider1.Value   'Mediaplayer1的开始点在滚动条的位置.
       MediaPlayer1.Play   '开始播放歌曲
       Timer1.Enabled = True   '计时器开始
    End If
End Sub

Private Sub playsong()
    MediaPlayer1.Stop '停止播歌
    MediaPlayer1.FileName = songname   '将上面所挑选的歌曲变量songname导入Mediaplayer1
    If Dir(songname) <> "" Then   '如果找得到这首歌
       Slider1.Enabled = True   '滚动条产生作用
       Slider1.Max = MediaPlayer1.Duration   '设定滚动条的最大值等于歌曲的总长度
       Slider1.Min = 0   '设定滚动条的最小值=0
       Slider1.Value = 0 '设定滚动条的开始值=0
       '设置 Slider1刻度标记的频率等于滚动条每隔20个增量设置一个刻度
       Slider1.TickFrequency = Slider1.Max / 20
       MediaPlayer1.Mute = False 'Mediaplayer1的静音失效
       MediaPlayer1.Play   '开始播放歌曲
       Timer1.Enabled = True   '计时器开始
       Command1(0).Enabled = False '让Command1(0)不能用
       Command1(1).Enabled = True   '让Command1(1)可用
    Else
       Command1(0).Enabled = False '让下面两个Command1都不能用
       Command1(1).Enabled = False
    End If
End Sub


--------------------编程问答-------------------- 谢谢了
我就想知道要用到什么函数
想自己写个,你的我拿来做参考
辛苦你了写了这么多,可我还属于菜鸟级别的,看不懂
呵呵 --------------------编程问答-------------------- 想做完整的播放器,千万别用API函数播放,太低级不说,还放不了几种格式的文件。想播放大多数常见格式的媒体文件呢,就得用其他的:1、WMP控件是个不错的选择;2、操作系统提供的运动图像播放库quartz.dll(在c:\windows\system32下面),是当今DriectShow的前身,集成了部分DriectShow,播放常见的音视频媒体文件不在话下,是COM组件,需要在VB工程属性中引用才能用。参见: 基于VB的流媒体解码与播放技术  http://tech.ddvip.com/2006-07/11541048486133.html 。 --------------------编程问答-------------------- 4 楼说的没错, 如果不是做一个 "完整的播放器" , 只用来当背景音乐或语音报数, 用API 来做是最佳的选择, 要做一个 "完整的播放器", API的 Mcisendstring等, 只能靠边站了.

以前我用 Mmcontrol 后来改用 Msdxm.ocx 的 Mediaplayer, 需要播放网络的资源我就用 Wmp.dll的Windowsmediaplayer

--------------------编程问答-------------------- 谢谢两位

--------------------编程问答-------------------- 楼上的两位朋友
你们说的WMP控件,运动图像播放库quartz.dll,Msdxm.ocx 的 Mediaplayer, 需要播放网络的资源我就用 Wmp.dll的Windowsmediaplayer

调用他们的格式是怎么写的呢?


谢谢  --------------------编程问答-------------------- 在工程部件最下面有两个,一个是 msdxm.ocx 另个是 wmp.dll 打勾应用就好

工程部件添加 windows Media Player(wmp.dll)

工程部件添加 windows Media Player(msdxm.ocx)

两个文件都在 System32


wmp.dll 的控件使用法 

WindowsMediaPlayer1.URL = "Http://......." 
WindowsMediaPlayer1.Controls.play 

'**************************************** 
Msdxm.ocx 的控件使用法 

Mediaplayer1.Filename="c:\test.mp3" 
Mediaplayer1.play 

--------------------编程问答-------------------- 非常谢谢
我去琢磨,琢磨 --------------------编程问答-------------------- 我曾经写过,就是 用 quartz.dll 来做的!

不过,现在已经赶不上时代的需求了! --------------------编程问答-------------------- dirctsound
--------------------编程问答-------------------- 工程-》部件-》windows media player-》确定-》在窗口中加入控件即可完成。 --------------------编程问答-------------------- 怎么样用全API函数实现呢? --------------------编程问答-------------------- 如果不是全能播放器的话,可以考虑用mp3play控件。如果要的话,我的资源里就有。我就用它编写了一个mp3播放器 --------------------编程问答--------------------
引用 10 楼 visionspace 的回复:
我曾经写过,就是 用 quartz.dll 来做的!

 不过,现在已经赶不上时代的需求了!


此话怎讲? --------------------编程问答-------------------- 我是菜鸟,学习了,受益很多,下去好好消化,感谢cbm666老师和chenjl1031这位朋友!谢谢。 --------------------编程问答-------------------- 学习了  --------------------编程问答-------------------- 使用 windows media player 控件是个不错的选择 --------------------编程问答-------------------- 楼主已于2008-03-04出国定居,后面的不要再回了!
补充:VB ,  多媒体
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,