返回列表 上一主題 發帖

[發問] WindowsMediaPlayer播放音檔問題

[發問] WindowsMediaPlayer播放音檔問題

請問各位大大,小弟使用vba WindowsMediaPlayer撥放音檔,
分別加入14個音檔list後,卻無法一次播完,平均每4個音檔會停止撥放,
在煩請大大解惑謝謝!
程式碼如下
Public Sub macro_test2()

Dim Bk_A As String
Bk_A = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 5)
'-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dim book_name As String
Dim book_path As String

book_name = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 5)
book_path = ThisWorkbook.Path

工作表001.WindowsMediaPlayer1.currentPlaylist.Clear

music_path01 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_各位旅客您好" & ".wav"
music_path02 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_6點" & ".wav"
music_path03 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_分50" & ".wav"
music_path04 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_分" & ".wav"
music_path05 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_開往" & ".wav"
music_path06 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_台北的" & ".wav"
music_path07 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_車次5" & ".wav"
music_path08 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_車次0" & ".wav"
music_path09 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_車次0" & ".wav"
music_path10 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_次" & ".wav"
music_path11 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_高鐵" & ".wav"
music_path12 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_北上" & ".wav"
music_path13 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_的列車即將進站請前往" & ".wav"
music_path14 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_第二月台" & ".wav"
music_path15 = ThisWorkbook.Path & "\" & "常用廣播" & "\" & "國語_搭乘並留意月台間隙謝謝" & ".wav"

Dim Xwmp As IWMPMedia

工作表001.WindowsMediaPlayer1.currentPlaylist.Clear

Set Xwmp = 工作表001.WindowsMediaPlayer1.newMedia(music_path05)
工作表001.WindowsMediaPlayer1.currentPlaylist.insertItem 0, Xwmp

工作表001.WindowsMediaPlayer1.Controls.Play

Set Xwmp = 工作表001.WindowsMediaPlayer1.newMedia(music_path06)
工作表001.WindowsMediaPlayer1.currentPlaylist.insertItem 1, Xwmp

工作表001.WindowsMediaPlayer1.Controls.Play

Set Xwmp = 工作表001.WindowsMediaPlayer1.newMedia(music_path07)
工作表001.WindowsMediaPlayer1.currentPlaylist.insertItem 2, Xwmp

工作表001.WindowsMediaPlayer1.Controls.Play

Set Xwmp = 工作表001.WindowsMediaPlayer1.newMedia(music_path08)
工作表001.WindowsMediaPlayer1.currentPlaylist.insertItem 3, Xwmp

工作表001.WindowsMediaPlayer1.Controls.Play

End Sub

To Joforn 大大
小弟想要控制音量,
在Public Sub StartPlay()中插入了音量控制code,
但無法控制音量大小,再請您解惑。

Public Sub StartPlay()

Dim V As Long
V = 1
mciSendString StrPtr("setaudio movie volume to " & V), &O0, 0, 0 'V是設置的音量值

  Dim I         As Long
  
  If waveOutGetNumDevs > 0 Then
    For I = 1 To ListCount Step 1
      With FileList(I)
        If Len(.ShortName) Then
          Select Case UCase$(ExtractFileExtension(.ShortName))
            Case ".WAV": mciSendString StrPtr("open " & .ShortName & " type waveaudio alias JofornMusic"), 0, 0, 0
            Case ".MDI": mciSendString StrPtr("open " & .ShortName & " type sequencer alias JofornMusic"), 0, 0, 0
            Case Else:   mciSendString StrPtr("open " & .ShortName & " alias JofornMusic"), 0, 0, 0
          End Select
          mciSendString StrPtr("play JofornMusic FROM 0"), 0&, 0, 0
          Do While Not IsEnd
            Sleep 50
            DoEvents
          Loop
          mciSendString StrPtr("close JofornMusic"), 0&, 0, 0
        End If
      End With
    Next I
  End If
End Sub

TOP

本帖最後由 lshsien 於 2016-1-26 09:25 編輯

To Joforn 大大
經測試(NB、桌機)後,您的程式碼皆可順利執行,
並解說了相關code,非常感謝您。

To  c_c_lai 大大
您在5樓供的程式碼,經小弟測試(NB上),
會直接撥最後一首。目前還在努力測試中。
您在16樓供的程式碼,經小弟測試(NB上),
會跟小弟下面所述問題有重複撥放的狀況。

另告訴兩外大大一個有趣的測試問題,
先說明測試環境
1、小弟的NB:
ACER 5830T
WIN10
Office 2010
(系統及OFICE皆更新至最新)
2、公司電腦
ASUS桌機(型號未知)
WIN7
OFFICE2010
(系統及OFFICE可能未更新至最新)

如用小弟的原始程式碼進行測試 ,
在NB上是可以持續播完、但唯獨有幾個音檔會重複1次(目前測試數次發現music_path08、music_path09、music_path15),
經檢查code後未發現任何錯誤。

在公司電腦上依舊是平均4首就會停止撥放,但音檔list是有進WindowsMediaPlayer,
需再次按下WindowsMediaPlayer撥放鍵,始可繼續撥。
為何同樣的code在不同電腦有著不一樣結果,令人匪夷所思阿!

再次感謝兩位費心指導!

TOP

回復 1# lshsien
基本上,Windows Media Player 是無法撥放  *.rmvb 檔,
如果你想透過 Windows Media Player 的撥放器來撥放
*.rmvb 的影片檔,其實務應用範例如下,提供大家參考:
  1. Option Explicit

  2. Dim MyPlayer As WindowsMediaPlayer

  3. Public Function playRMVB(ByVal fileName As String)
  4.     MyPlayer.URL = fileName        '  需以 .URL 方式宣告
  5.     DoEvents
  6.     MyPlayer.Controls.Play
  7. End Function

  8. Public Function InitialList()
  9.     MyPlayer.Controls.stop
  10.    
  11.     DoEvents
  12.     If MyPlayer.playState = 0 Or MyPlayer.playState = 1 Or MyPlayer.playState = 10 Then
  13.         '  0 = "Undefined"  /  1 = "Stopped"  /  10 = "Ready"
  14.         ListIdx = 0
  15.         MyPlayer.currentPlaylist.Clear
  16.     End If
  17. End Function

  18. Sub Ex()
  19.     Set MyPlayer = 工作表1.WindowsMediaPlayer1
  20.     InitialList
  21.    
  22.     '  ******************************************************************
  23.     '  撥放 RMVB 影片檔需先安裝 Real_Alternative 的解析碼後, Windows
  24.     '  Media Player 才能進行解析 RMVB 影片檔,進而始能直接撥放它。
  25.     '  http://www.free-codecs.com/real_alternative_download.htm
  26.     '  以下三行係 .rmvb 影片之撥放程序  (*** 但只能放置在第一首撥放 ***)
  27.     '  1. MyPlayer.URL = ThisWorkbook.Path & "\\" & "xxxxxxxx.rmvb"
  28.     '  2. DoEvents
  29.     '  3. MyPlayer.Controls.Play
  30.     '  ******************************************************************
  31.     playRMVB ThisWorkbook.Path & "\\" & "xxxxxxxx.rmvb"
  32. End Sub
複製代碼

TOP

本帖最後由 c_c_lai 於 2016-1-24 20:42 編輯

回復 1# lshsien
我特選了九首音樂 (樂曲長短不一,含MP4檔),反覆測試
均能正常撥放。你試試看吧!
  1. Option Explicit

  2. Dim Xwmp As IWMPMedia                       '  Playlist
  3. Dim MyPlayer As WindowsMediaPlayer
  4. Dim ListIdx As Long

  5. Public Function addList(ByVal fileName As String)
  6.     Set Xwmp = MyPlayer.newMedia(fileName)
  7.     MyPlayer.currentPlaylist.insertItem ListIdx, Xwmp
  8.     ListIdx = ListIdx + 1
  9.     DoEvents
  10.     MyPlayer.Controls.Play
  11. End Function

  12. Public Function rmvList()
  13.     DoEvents
  14.     If MyPlayer.playState = 1 Or MyPlayer.playState = 10 Then      '  "Stopped"  or  "Ready"
  15.         ListIdx = 0
  16.         MyPlayer.currentPlaylist.Clear
  17.     End If
  18. End Function

  19. Sub Ex()
  20.     Set MyPlayer = 工作表1.WindowsMediaPlayer1
  21.     rmvList
  22.    
  23.     addList ThisWorkbook.Path & "\\" & "大悲咒天使波羅蜜.wav"
  24.     addList ThisWorkbook.Path & "\\" & "寶篋咒.mp3"
  25.     addList ThisWorkbook.Path & "\\" & "舒伯特 小夜曲 大提琴演奏 .mp4"
  26.     addList ThisWorkbook.Path & "\\" & "聖誕快樂 01.mp4"
  27.     addList ThisWorkbook.Path & "\\" & "01_巴哈 G弦之歌 Air On the G string.mp3"
  28.     addList ThisWorkbook.Path & "\\" & "鐵達尼號 - My Heart Will Go On (我心永恆) 中英文字幕.mp4"
  29.     addList ThisWorkbook.Path & "\\" & "02_NOCTURNE.mp3"
  30.     addList ThisWorkbook.Path & "\\" & "03_SAULT D' AMOUR.mp3"
  31.     addList ThisWorkbook.Path & "\\" & "- Barcarolle in F sharp, Op.60.mp3"
  32. End Sub
複製代碼

TOP

回復  Joforn
回復  c_c_lai

想不道 EXCEL 除計算外,還能撥放音樂,各路英雄的踴躍發表讓EXCEL越來越 ...
ML089 發表於 2016-1-23 15:22

要先安裝相關的解碼器,不過本人沒有具體測試過,你可以自己測試下,但要注意的是調用時指定好用來顯示畫面的窗體句柄。
世界那麼大,可我想去哪?

TOP

回復 13# ML089


只要能調用 std dll 的語言
幾乎都能無所不能
所以語言不是關鍵
底層技術才是關鍵

TOP

回復 10# Joforn
回復 12# c_c_lai

想不道 EXCEL 除計算外,還能撥放音樂,各路英雄的踴躍發表讓EXCEL越來越有趣。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 10# Joforn
回復 9# ML089
Pause  以及 Resume 的處理,我寫了一
函式,如下:
  1. Public Sub PauseResume()
  2.     Static Msg As Boolean    '  用以判定是否為每日第一次執行
  3.    
  4.     If Msg = False Then
  5.         mciSendString StrPtr("pause JofornMusic"), 0&, 0, 0
  6.         Msg = True
  7.     Else
  8.         mciSendString StrPtr("resume JofornMusic"), 0&, 0, 0
  9.         Msg = False
  10.     End If
  11. End Sub
複製代碼
另外,再請教 Joforn 大大,如果想要執行 *.rmvb 的媒體檔,
還要加掛那些 Lib,才能夠執行?
謝謝你!

TOP

mciSendString函數是用來播放多媒體文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,使用此API函數可以創建一個簡易的播放器,下面介紹它的使用方法:
  該函數有四個參數:
第一個參數:要發送的命令字符串。字符串結構是:[命令][設備別名][命令參數].
第二個參數:返回信息的緩衝區,為一指定了大小的字符串變量.
第三個參數:緩衝區的大小,就是字符變量的長度.
第四個參數:回調方式,一般設為零
返回值:函數執行成功返回零,否則返回錯誤代碼

一、常用命令
1.打開(Open),格式:Open 設備名[type 設備型式][alias 別名]
Dim mName as string
mName = "f:\mpeg\mpeg1.avi"
mciSendString "open " & mName & " type MPEGVideo Alias​​ JofornMusic parent %u Style %u notify",0&, 0, 0
 其中:
open 操作命令
mName 全路徑文件名
type MPEGVideo 是指打開MPEG,AVI等類型,如果不加這一句,就是打開WAV,MP3等
Alias​​ JofornMusic 定義了該操作的別名為movie,後續操作只要指明別名即可
parent %u 源
Style %u 樣式
notify 通知
2.播放(Play),格式:Play 設備名[from 起點][to 終點]
mciSendString "play JofornMusic", 0&, 0, 0
mciSendString "play JofornMusic fullscreen", 0&, 0, 0 '全屏播放
  3.暫停(Pause):
mciSendString "pause JofornMusic", 0&, 0, 0
  4.繼續(Resume):
mciSendString "resume JofornMusic", 0&, 0, 0
  5.停止(Stop):
mciSendString "stop JofornMusic", 0&, 0, 0
  6.​​關閉(Colse):
mciSendString "close JofornMusic", 0&, 0, 0
  7.前進到下一個位置:
mciSendString "step JofornMusic", 0&, 0, 0
  8.後退到上一個位置:
mciSendString "step JofornMusic reverse", 0&, 0, 0
9.前進或後退N 個位置(其中N<0 即表示後退)
mciSendString "step JofornMusic by " & str(N), 0&, 0, 0
  10.獲取當前播放位置:
Dim ST As String*64
mciSendString "status JofornMusic position", st, len(st), 0
  11. ​​獲取媒體的總長度:
mciSendString "status JofornMusic length", st, len(st), 0
l=val(st) 'l就是所播放文件的長度
  12.獲取播放當前狀態:
Dim ST As String*64
mciSendString "status JofornMusic mode", ST, Len(ST), 0
If Left(ST, 7) = "stopped" Then (處理代碼) '播放完畢
  13.循環播放:
mciSendString "play JofornMusic repeat", 0&, 0, 0

二、控制聲音大小(1-1000):
Dim V As Long
mciSendString "status JofornMusic volume",&V, len(v), 0 'V是獲取的音量大小值。
V = 50
mciSendString "setaudio JofornMusic volume to 數值", 0, 0, 0 'V是設置的音量值

三、設置播放位置.(需事先設定時間格式),格式:Seek 設備名[to 位置| to start | to end]
Dim P1 as Long, P2 as Long
P1 = 100: P2 = 3000
mciSendString "seek JofornMusic to ", P1, 0, 0 'P1是當前起始位置,單位:毫秒
mciSendString "seek JofornMusic to start", 0&, 0, 0 '定位到開頭位置
mciSendString "play JofornMusic", 0&, 0, 0 '定位後再播放
或者:
mciSendString "play JofornMusic FROM P1 to P2",0&, 0, 0 'P1是起始位置,P2是停止位置。單位:毫秒
mciSendString "seek JofornMusic to end", 0&, 0, 0 '定位到最後位置

四、在指定控件上播放視頻:
mciSendString "open AVI 文件名parent hWnd style child", 0&, 0, 0
其中,hWnd 是控件的句柄
執行上述命令之後,影片會被放置在控件的左上角,且影片的大小不受控件大小的影響,如果想要改變
影片播放的位置及大小,可以在執行play 指令前先執行put 指令,格式如下:
mcisendString "put AVI 文件名window at XY [Width Height]", 0&, 0, 0
其中:X、Y為影片左上角坐標,Width、Height為影片的寬高度

五、如果播放視頻還可控制亮度(1-2000)
Dim B As Long
mciSendString "status JofornMusic brightness", B, 0, 0 'B是獲取的亮度值。
B = 50
mciSendString "setvideo JofornMusic brightness to " & B, &0, 0, 0 'B是設置的亮度值

六、錄音設置:
  錄音前,用以下語句初始化
  1.設為8位:
mciSendString "set wave bitpersample 8", "", 0, 0
  2.設為11025Hz
mciSendString "set wave samplespersec 11025", "", 0, 0
  3.設為立體聲:
mciSendString "set wave channels 2", "", 0, 0
  4.實現PCM格式(不一定正確):
MCISENDSTRING "set wave format tag pcm","", 0, 0
  5.開始錄音:
mciSendString "close JofornMusic",0&,0,0
mciSendString "open new type WAVEAudio alias JofornMusic",0&,0,0
mciSendString "record JofornMusic",0&,0,0
  6.​​保存錄音到c:\123.wav
mciSendString "stop JofornMusic",0&,0,0
mciSendString "save JofornMusic C:\123.wav",0&,0,0
mciSendString "close JofornMusic",0&,0,0

七、開關光驅:
mciSendString "set cdaudio door open", "", 0, 0 '打開
mciSendString "set cdaudio door close", "", 0, 0 '關閉

八、其它
  1.設置設備的各種狀態(Set)
Set alias_name[audio all off][audio all on][time format ms]:
Set命令用來設置設備的各種狀態.如:靜音,有聲音,時間格式為毫秒等.
  2.取得設備的狀態(Status)
Status alias_name[length][mode][position]:
Status命令用來取得設備的狀態.如:該媒體文件的長度,該媒體文件所處狀態,該媒體文件的當前位置等. 的長度,該媒體文件所處狀態,該
媒體文件的當前位置等.
參考代碼:
TCHAR fileName[]="D:\俺的文檔\my music\爺爺泡的茶.mp3";
TCHAR shortName[MAX_PATH];
GetShortPathName(fileName,shortName,sizeof(shortName)/sizeof(TCHAR));
TCHAR cmd[MAX_PATH+10];
wsprintf(cmd,"play %s",shortName);
mciSendString(cmd,"",NULL,NULL);
(調用mciSendString第一個參數傳“play 文件全路徑”就可以,“文件全路徑”最好傳絕對路徑,不建議wanghepeng10那樣值傳遞文件名。
另外如果文件全路徑中含有空格的話要使用GetShortPathName轉換成短路徑。 )
1

評分人數

世界那麼大,可我想去哪?

TOP

        靜思自在 : 待人退一步,愛人寬一寸,就會活得很快樂。
返回列表 上一主題