为什么用mcisendstring播放MP3时遇到中文的文件名时就不能播放啦而且也不能得到播放进度、当前播放状态等。?英文的倒是可以的。Private Sub play_Click()
Dim a As Long
a = mciSendString("close all", vbNull, 0, 0)
Debug.Print "1  " & GetMCIErrorString(a)
Debug.Print "2  " & ShortPathName(txtName.Text)
a = mciSendString("OPEN " & ShortPathName(txtName.Text) & " alias NOWPLAY type mpegvideo", 0&, 0, 0)
Debug.Print "3  " & GetMCIErrorString(a)
a = mciSendString("Play NOWPLAY", 0&, 0, 0) '这一句出现“指定的设备未打开,或不被 MCI 所识别。 ”的错误
Debug.Print "4  " & GetMCIErrorString(a)
txtLen.Text = GetMusicLen & "  " & GetMusicTotalTime
Timer1.Enabled = True
'Probar.Min = 1
'Probar.Max = GetMusicLen
End Sub
这时的文件名为:F:\Music\Beyond\光辉岁月\光辉岁月.mp3(8。3:F:\Music\Beyond\光辉岁月\光辉岁月.mp3)而如果我用:F:\Music\BackStreet Boys\BackStreet Boys\Anywhere For You.mp3(8。3:F:\Music\BACKST~1\BACKST~1\ANYWHE~1.MP3)的文件名就可以正常播放。F:\Music\柏林之声\02_Live In America.mp3(8。3:F:\Music\柏林之声\02_LIV~1.MP3)这样的文件名也不能播放。F:\Music\Beyond\PARADISE\PARADISE[演奏版].mp3(8。3:F:\Music\Beyond\PARADISE\PARADI~1.MP3)这个文件也能播放。正常时的四句debug:
1  指定的命令已被执行。 
2  F:\Music\Beyond\PARADISE\PARADI~1.MP3
3  指定的命令已被执行。 
4  指定的命令已被执行。 不正常时的四句debug:
1  指定的命令已被执行。 
2  F:\Music\Beyond\光辉岁月\光辉岁月.mp3        
3  指定的命令已被执行。 
4  指定的设备未打开,或不被 MCI 所识别。我列了怎么多文件名无非是想说,英文的文件名就可以播放(包括路径),包含中文的就不可以,但奇怪的是最后一个文件名中包含中文也能播放,各位有什么好的方法解决这个问题吗?还有一个情况,就是不用alias参数,而直接用文件名的话倒是可以播放,但还是不能得到播放进度、当前播放状态等。

解决方案 »

  1.   

    不是不支持中文名,是不支持长文件名,你需要把它转换成DOS格式的短文件名!!
      

  2.   

    我已经转了呀,上面写的很清楚了:
    a = mciSendString("OPEN " & ShortPathName(txtName.Text) & " alias NOWPLAY type mpegvideo", 0&, 0, 0)
    Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long'获取短文件名
    Public Function ShortPathName(ByVal strPathName As String) As String
    Dim lngLen As Long
    Dim strTemp As String * 255
    lngLen = GetShortPathName(strPathName, strTemp, 255)
    ShortPathName = Left$(strTemp, lngLen)
    End Function
      

  3.   

    对不起,终于找到原因了,是获取短文件名的函数出错了,在获取包含中文的文件名时出错(文件名的后面还有几个空格,这样的话文件名就不对了),改成下面的以后可以播放了。
    '获取短文件名
    Public Function ShortPathName(ByVal strPathName As String) As String
    Dim lngLen As Long
    Dim strTemp As String * 255
    lngLen = GetShortPathName(strPathName, strTemp, 254)
    ShortPathName = Left$(strTemp, InStr(1, strTemp, Chr(0)) - 1)
    End Function
    看来有时候也不能太相信API啊(我是指返回的lngLen这个值竟然不对的)
      

  4.   

    请问为什么用下用的方法得到的长度在转换成MM:SS格式后不对啊
    '获取媒体的长度(数值)
    Public Function GetMusicLen() As Long
      Dim RefStr As String * 80
      mciSendString "status NOWPLAY length", RefStr, 80, 0
      GetMusicLen = Val(RefStr)
    End Function
    '转换成HH:SS格式的代码
     '获取MP3总长
    public function gettotaltime() as string
      intCount = Int(GetMusicLen / 1000)
      strMin = Format$(Int(intCount / 60), "00")
      strSec = Format$(intCount Mod 60, "00")
      gettotaltime = strMin & ":" & strSec
    end function
    说明一点:当MP3的BitRate为112、128、192、320等标准BitRate时正确的,
    但如果是230、240、168等等不规则的BitRate时就不正确,总是比正确的大了好多。另外请问怎么获取MP3的BitRate呢?
    '获取MP3的比特率
    Public Function GetMusicBitRate() As Long
      Dim a As Long
      Dim RefStr As String * 80
      a = mciSendString("status NOWPLAY 这儿填什么呀?", RefStr, 80, 0)
      Debug.Print "2  " & a & "  " & GetMCIErrString(a)
      GetMusicBitRate = Val(RefStr) / 1000
    End Function最后一个问题,mp3play的ThreadEnded事件及ActFrame事件用mciSendString能实现吗?还是mp3play里根本就是用了TIMER控件或类似的API