无外部控件制作多媒体播放器(四)

控件|媒体

音乐文件列表也是个不容忽视的问题,自己定个格式当然可以,但好在大家熟悉的M3U格式并不复杂,MediaPlayer或WinAmp都支持它,通用性也好,比起wpl要简易得多,所以我就来介绍一下M3U格式文件的制作与读写

M3U是文本文件,以#EXTM3U开头,每个音乐条目占1-2行,当存在扩展信息时,首行采用#EXTINF:开头,第二行才是文件名;当没有扩展信息时,只是简单的一行,就是文件名;文件名可包含路径,也可不包含,不包含时音乐文件应该是与M3U文件在同一目录下。

整个格式就这么简单,下面是读取函数,与保存函数,读取时返回的是一个M3U集合,每个集合项目为一首音乐信息的字符串,想获取这个串的具体内容, 可用GetM3UInfo函数返回MusicInfo结构。

保存函数不太完善,需传入一个M3U集合,因使用集合传递M3U字串信息,每个条目只能添加删除,不能直接修改。若有兴趣,可采取类封装MusicInfo结构,并提供修改功能。

Private Function LoadM3UFile(strFileName As String) As Collection
    Dim a() As String, s1 As String, s As String, i As Long, FileLine() As String
    Dim blnAddOK As Boolean, strFilePath As String, colTemp As Collection, LineNum As Long
    On Error GoTo fail
    Set colTemp = New Collection
    If Dir(strFileName) = vbNullString Then GoTo fail
    strFilePath = Left$(strFileName, InStrRev(strFileName, "\"))
    Open strFileName For Binary As #1
        s = Input(LOF(1), 1)
    Close
    If s = vbNullString Then GoTo fail
    i = InStr(1, s, "#EXTM3U", vbTextCompare)
    If i = 0 Then GoTo fail
    If i > 1 Then s = Mid$(s, i)
    s = Trim$(Replace$(s, vbCrLf & vbCrLf, vbCrLf))
    FileLine = Split(s, vbCrLf)
        Do While LineNum <= UBound(FileLine)
            s = Trim$(FileLine(LineNum))
            If s <> vbNullString Then
                blnAddOK = False
                If UCase$(Left$(s, 8)) <> "#EXTINF:" Then
                    If InStr(1, s, ":\") = 0 Then
                        s = strFilePath & s
                        If Dir(s, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then blnAddOK = True
                    Else
                        If Dir(s, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then
                            blnAddOK = True
                        Else
                            s = strFilePath & Mid$(s, InStrRev(s, "\") + 1)
                            If Dir(s, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then blnAddOK = True
                        End If
                    End If
                    If blnAddOK Then
                        If GetMCIType(s) > 0 Then
                            colTemp.Add s, s
                        End If
                    End If
                Else
                    s = Mid$(s, 9)
                    LineNum = LineNum + 1
                    s1 = Trim$(FileLine(LineNum))
                    If s1 <> vbNullString Then
                        If InStr(1, s1, ":\") = 0 Then
                            s1 = strFilePath & s1
                            If Dir(s1, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then blnAddOK = True
                        Else
                            If Dir(s1, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then
                                blnAddOK = True
                            Else
                                s1 = strFilePath & Mid$(s1, InStrRev(s1, "\") + 1)
                                If Dir(s1, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then blnAddOK = True
                            End If
                        End If
                        If blnAddOK Then
                            If GetMCIType(s1) > 0 Then
                                colTemp.Add s & vbCrLf & s1, s1
                            End If
                        End If
                    End If
                End If
            End If
            LineNum = LineNum + 1
        Loop
fail:
    Set LoadM3UFile = colTemp
End Function
Private Function SaveM3U(strFileName As String, colM3UList As Collection) As Boolean
    Dim FreeNo As Long, i As Long, a() As String
    On Error GoTo fail
    If colM3UListe.Count > 0 Then
        FreeNo = FreeFile
        Open strFileName For Output As #FreeNo
        Print #FreeNo, "#EXTM3U"
        For i = 1 To colM3UListe.Count
        a = Split(colM3UListe(i), vbCrLf)
        If UBound(a) > 0 Then
            Print #FreeNo, "#EXTINF:" & colM3UListe(i)
        Else
            Print #FreeNo, colM3UListe(i)
        End If
        Next
        Close #FreeNo
        SaveM3U = True
    End If
fail:
End Function
Private Function GetM3UInfo(M3UItem As String) As MusicInfo
    Dim a() As String, b() As String, tmpinfo As MusicInfo
    Dim i As Long, j As Long, k As Long, s As String
    If Trim(M3UItem) = vbNullString Then Exit Function
    a = Split(M3UItem, vbCrLf)
    If UBound(a) > 0 Then
        j = InStr(1, a(0), ",")
        k = InStr(1, a(0), "-")
        If j > 0 And k > 0 Then
            b = Split(a(0), ",")
            If Val(b(0)) > 0 Then tmpinfo.length = Val(b(0))
            b = Split(Trim$(b(1)), "-")
            If b(0) <> vbNullString Then tmpinfo.Artist = Trim$(b(0))
            If b(1) <> vbNullString Then
                tmpinfo.Title = Trim$(b(1))
            Else
                s = Trim$(a(1))
                i = InStrRev(s, "\")
                If i > 0 Then
                    tmpinfo.Title = Mid$(s, i + 1)
                Else
                    tmpinfo.Title = s
                End If
            End If
        End If
        tmpinfo.FileName = a(1)
    Else
        tmpinfo.FileName = a(0)
    End If
    GetM3UInfo = tmpinfo
End Function

Private Sub Command1_Click()
    Dim tmp As Collection, tmpinfo As MusicInfo, s As String
    Set tmp = LoadM3UFile(Text1.Text)
    If tmp.Count > 0 Then
        tmpinfo = GetM3UInfo(tmp(tmp.Count))
        s = "文件:" & tmpinfo.FileName
        s = s & vbCrLf & "歌名:" & tmpinfo.Title
        s = s & vbCrLf & "歌手:" & tmpinfo.Artist
        s = s & vbCrLf & "曲长:" & tmpinfo.length & "秒"
        MsgBox s
    End If
End Sub

这是一个与上篇相联系的代码,对于一些没定义的函数,可在前面的文章中找到
http://blog.csdn.net/homezj/archive/2005/04/15/349005.aspx

时间: 2016-04-30
Tags: string, end, THEN, vbcrlf, s:if

无外部控件制作多媒体播放器(四)的相关文章

无外部控件制作多媒体播放器(一)

控件|媒体 利用MCI指令制作播放器,简单实用,很适合于做为自己软件的一个附带功能或背景音乐,正是基于这点需求,我准备分几个部分来写: 1.MCI指令的简单使用:2.媒体播放的进度控制与音量调节:3.音乐信息的读取,包括MP3(ID3V1 & ID3V2)与ASF(WMA & WMV)等:4.音乐列表的建立与保存(M3U格式) 本来主要是想写播放音乐的,举个播放视频的例子,没什么别的意思,只是感觉播放音乐实在是简单,没什么可写,同时也是为了说明,MCI放视频也是可以的. Private C

无外部控件制作多媒体播放器(二)

控件|媒体 本来想写点进度控制与音量调整的代码的,后来发现还是太简单了,就是几个MCI命令,来回搬弄,自己都没兴趣写下去.所以我想还是写些独门一点的:音乐信息的读取! 目前常见的主流音乐格式就两种,MP3与WMA,它们都有在文件中保存音乐信息的特定格式,MP3使用的当然是家喻户晓的ID3格式,分为V1与V2两个版本:WMA是MS的宠儿,它只是ASF格式的一个分支,当然遵循ASF的包装规则. 怎么获取它们包含的音乐信息呢?一般是自己读取,当然XP系统开始提供了音乐文件的详细信息资料,利用FSO可以

无外部控件制作多媒体播放器(三)

控件|媒体 ASF全名为高级系统格式,是MS大力推宠的一种媒体格式,并已得到广泛支持.其最主要的分支就是用于音频的WMA与视频的WMV,当然还有ASF自身.在下面地址可下载到ASF格式的说明文档:http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx ASF格式由一个个不同功能的ASF对象组成,每个对象都有一个GUID做标识,你只需识别对象后,按对象格式读结构,就能找到你要的信息.媒体信息内容都在ASF头部对象ASF_H

vc++6 0-用vc++6.0 利用windows media player控件制作播放器时

问题描述 用vc++6.0 利用windows media player控件制作播放器时 在win7 64位环境下 要对 播放器进行暂停 快进等操作时 调用 CWMPcontrols 函数时 显示 'CWMPcontrols.h': No such file or directory 头文件 也加了 cwmpcontrols.h 头文件换成小写也是不行的 也说不能打开 没有这个文件 cwmpcontrols.h 头文件是存在的在工程目录下: 解决方案 你的VC++版本太旧,没有这个头文件.建议你

vs2008-VS2008制作多媒体播放器,WindowsMediaPlayer控件按钮出错

问题描述 VS2008制作多媒体播放器,WindowsMediaPlayer控件按钮出错 播放媒体后,按停止键(WindowsMediaPlayer),再将鼠标移至菜单栏(没有点击),立刻又继续播放 以下是部分代码: BOOL CPLAYERDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon

IOS UI学习教程之使用UIImageView控件制作动画_IOS

本文实例为大家分享了IOS使用UIImageView控件制作动画的方法,供大家参考,具体内容如下 先添加40张tomcat的图片到资源列表中:名称为cat_eat0000.jpg到cat_eat0039.jpg. 1.定义所需控件 // 定义按钮,图片控件.可变数组对象 UIButton *actionbuttom; UIImageView *imageMove; NSMutableArray *imgsarray; 2.初始化各控件 // image动画 // 初始化UIImageView,大

BCB控件制作和消息处理

1 前言 作为和delphi类似的rad(rapid application development)工具,c++ builder的强大功能不仅体现在数据库开发方面,也凸现于应用程序开发上(令人称绝的是这两方面结合得非常好).仅就应用程序而言,要真正体现c++ builder的优势,开发出高质量的软件,则在拖拉拽放之外,尚需用到一些进阶技术.如消息处理.dll.ole.线程.sdk编程.c++ builder在这些方面都或多或少有独到的优势.此外,可以方便地制作自定义控件,也是c++ build

wpf日历控件制作过程分析(2) 自定义样式属性

接上篇wpf日历控件制作过程分析(1) 定义header 在header中,我们看到了定义一个自定义样式TitleStyle 1.自定义样式 看后台代码定义 Code /**//// <summary> /// The DependencyProperty for the TitleStyle property. /// Flags: none /// Default Value: null /// </summary> public static readonly Depende

C/S模式开发中如何利用WebBrowser控件制作导航窗体

原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见进销存系统的同学肯定知道,在进入系统之后一般在mdi窗体中系统自动打开一个导航子窗体.将一些常见的功能以非常直观的图形展示给用户.观察市面上的此类产品,该功能基本是所有mdi窗体开发的管理系统中必备的功能窗体.下面我们就来分析一下如何在.net中实现这个功能.幸好我上次做了一个类似的系统,里面也用到