用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發出各種指令,在編程時需要格外謹慎,否則……去嘗試一下吧!