VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用MMControl控件播放M3U文件的实现
发表评论(0)作者:土人, 平台:VB6.0+Win98, 阅读:11401, 日期:2002-05-06
在以前,VB程序员大都以为MMControl控件在应付媒体文件方面不是很争气,笔者甚至在一些颇有权威的书籍上看到在探讨完这个控件之后建议读者:如欲编制一个能播放MP3文件的播放器,请去找相关控件。其实,这是对MMControl的误解。MMControl作为能对系统硬件进行操作和控制的控件,其功能是强大的,它对付MP3也不在话下!不信?我以前也不信——专家都这么以为嘛。可现在我信了:我在VB6.0、PWin98下试验成功!播放质量?呵呵,比Mediaplayer好不了多少。Bill的东西嘛,让人又爱又无奈……

  遗憾的是,MMCtrol控件不支持M3U列表文件。这得处理一下。谁叫M3u那么方便呢?

  我们知道,M3U其实是和TXT文件性质一样的东西,都是文本文件。M3U文件所存储的内容是一系列的媒体文件所在的二进制地址,如将M3U文件打开并把各个媒体文件所在位置的标志存入数组,就可以叫MMControl一一地播放了。考虑到资源的占用问题,笔者以下的实例将M3U文件的内容打开后添加到列表框,然后让MMControl进行处理,有兴趣的朋友可以试一下数组。

  本例需要:按钮若干;列表框一个;Timer一个;ProgressBar(进度条)一个;老M当然不能少了。

  详细代码如下:

Option Explicit

Dim MaxVal As Long 注释:进度条Max值变量
Dim MyInd As Integer 注释:播讲的文件索引变量
Dim sF As String 注释:要播放的M3U文件

Private Sub cmdNext_Click() 注释:“下一首”按钮代码
PlayNext
List1.SetFocus 注释:让按钮好看点,下同
End Sub

Private Sub cmdPause_Click() 注释:“暂停”按钮代码
MMControl1.Command = "Pause"
List1.SetFocus
End Sub

Private Sub cmdPlay_Click() 注释:“播放”按钮代码
List1.SetFocus
If MMControl1.Command = "Stop" Or MMControl1.Command = "Pause" Then
MMControl1.Command = "Play"
Else
Call PlayMe 注释:交给PlayMe处理
End If
End Sub

Private Sub cmdExit_Click() 注释:“退出”按钮代码
MMControl1.Command = "close" 注释:关闭以释放资源
End
End Sub

Private Sub cmdPre_Click() 注释:“前一首”按钮代码
Timer1.Enabled = False
List1.SetFocus
If MyInd = 0 Then 注释:当前是第一首则播放最后一首
List1.ListIndex = List1.ListCount - 1
Else 注释:否则播放前一首
List1.ListIndex = MyInd - 1
End If
MyInd = List1.ListIndex 注释:这个变量要记得改哟
Call PlayMe
End Sub

Private Sub Form_Load() 注释:程序加载
Timer1.Enabled = False
Timer1.Interval = 1000
List1.BackColor = vbBlack
List1.ForeColor = vbYellow
MMControl1.Visible = False
MyInd = 0
cmdOpen.Value = True 注释:“打开”按钮被按下
注释:OpenM3u 注释:打开M3U文件
注释:PlayMe 注释:播放
End Sub

Private Sub cmdOpen_Click() 注释:“打开”按钮代码
On Error GoTo openerr:
List1.Clear
CommonDialog1.Filter = "(*.m3u)|*.m3u" 注释:这个不用说了吧
CommonDialog1.ShowOpen
sF = CommonDialog1.FileName
OpenM3u 注释:打开M3U文件
Exit Sub
openerr:
Timer1.Enabled = False 注释:出错则不能让计时器工作
注释:出错信息自己写吧
End Sub

注释:当点击右上角的“×”按钮时
Private Sub Form_Unload(Cancel As Integer)
MMControl1.Command = "Close" 注释:关闭设备以释放资源
End Sub

Private Sub List1_dblClick() 注释:双击列表框事件
MyInd = List1.ListIndex
cmdPlay.Value = True
End Sub

注释:判断是否要播放下一首
Private Sub MMControl1_StatusUpdate()
If MMControl1.Position = MMControl1.Length Then
PlayNext
End If
End Sub

Private Sub PlayMe() 注释:播放媒体文件
With MMControl1 注释:以下语句是不是有点罗嗦?
.FileName = List1.List(MyInd)
.Command = "stop"
.Command = "close"
.Command = "Open"
.Command = "play"
End With
MaxVal = MMControl1.Length
Timer1.Enabled = True
Me.Caption = List1.List(MyInd) 注释:显示正在播放的文件名称
ProgressBar1.ToolTipText = "播放总数:" & List1.ListCount & "首"
注释:注释:显示播放文件总数
End Sub

Private Sub Timer1_Timer()
注释:进度条的Max和Value值
ProgressBar1.Max = MaxVal
ProgressBar1.Value = MMControl1.Position
End Sub

Private Sub PlayNext() 注释:播放下一首
Timer1.Enabled = False
ProgressBar1.Value = 0
MyInd = MyInd + 1 注释:当然加1了
If MyInd >= List1.ListCount Then MyInd = 0
Call PlayMe 注释:呵呵,偷懒一下吧
List1.ListIndex = MyInd
End Sub

Private Sub OpenM3u() 注释:打开M3U文件并存入内存
On Error GoTo M3uErr
Dim AllLines As New Collection 注释:内存中集全
Dim CurrentLine As Long 注释:当前行集合索引
Dim nextLine As String 注释:从文件中读出的每一行
Dim InFile As Integer 注释:文件的描述符
InFile = FreeFile
Open sF For Input As InFile 注释:打开文件
While Not EOF(InFile)
Line Input #InFile, nextLine
AllLines.Add nextLine
Wend
Close InFile
Dim i As Integer
注释:以下为提取各行
For i = 0 To AllLines.Count - 1
CurrentLine = CurrentLine + 1
If AllLines.Count < CurrentLine Then
CurrentLine = 1
End If
If AllLines.Count > 0 Then 注释:当然要加入列表框啦
List1.AddItem AllLines.Item(CurrentLine)
End If
Next i
MMControl1.FileName = List1.List(0) 注释:老M终于有文件要处理了
List1.ListIndex = 0
注释: 列表框第一项高亮——老M就是靠它来判断下一首是什么
Exit Sub
M3uErr:
注释:......我累了
End Sub


  最后想提醒一下:由于MMControl控件直接对MCI发出各种指令,在编程时需要格外谨慎,否则……去尝试一下吧!