top
Loading...
用MMControl控件播放M3U文件的實現

在以前,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發出各種指令,在編程時需要格外謹慎,否則……去嘗試一下吧!
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗