簡體   English   中英

從已發布的應用程序中使用WMPLib.WindowsMediaPlayer從my.resources播放mp3,而無需將文件寫入客戶端計算機VB Express 2012,VB.net

[英]Play mp3 from my.resources using WMPLib.WindowsMediaPlayer from released application without writing file to client computer VB Express 2012, VB.net

我正在使用VB Express 2012(VB.net)制作具有.wav音效和.mp3背景音樂的學校教育游戲。 我的代碼在下面給出,並且可以在任何個人計算機上正常工作,但是由於我使用WMPLib.WindowsMediaPlayer播放mp3的方法,計算機沒有遇到寫入或刪除文件到包含應用程序執行文件的文件夾的權限,因此遇到了障礙。 由於wmp需要指向mp3文件的外部文件的URL(為什么?),因此我必須將my.resource文件夾中的mp3寫入客戶端計算機以獲得有效的URL,然后在關閉程序時將其刪除。 如果未授予許可,此操作將失敗。

是否有另一種方法可以使用wmp.dll從發布的應用程序中從my.resources播放mp3文件,而無需將文件寫入客戶端計算機? 某種形式的流媒體播放? 我以前從未涉足這一領域。 順便說一句,將我的mp3轉換為wav文件是不合理的,因為應用程序的大小可能太大。 (盡管我的代碼段僅以一個為例,但我有許多mp3。這是我的代碼:

對於聲音效果,我使用

My.Computer.Audio.Play(My.Resources.soundeffect, AudioPlayMode.Background) 

對於背景音樂,為了使歌曲不受聲音效果的干擾,我添加了wmp.dll參考並使用以下代碼:

Dim WithEvents Player As New WMPLib.WindowsMediaPlayer
Player.settings.setMode("Loop", True)
Dim appPath As String

'get the location of application execute file
appPath = Application.StartupPath & "\" & "SongNameHere" & ".mp3"

'write the mp3 file to the folder containing the execute file so wmp accepts the URL
My.Computer.FileSystem.WriteAllBytes(appPath,My.Resources.ResourceManager.GetObject("SongNameHere"), False)

'assign the valid URL to the wmp player, it autostarts.
Player.URL = appPath

而且,以防萬一,這很重要,在.formclosing上,我使用以下代碼刪除了這些歌曲:

My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\" & "SongNameHere" & ".mp3")

感謝D. Digaetano先生提供以下解決方法(關鍵解決方案以粗體顯示):

“ ...沒有使用.NET播放資源打包的MP3文件的本地方法。C#甚至不允許這樣做。

獲取MP3文件的唯一方法是創建一個在資源上運行的流,但是Windows Media Player ActiveX對象不支持將流作為輸入。

許多人似乎使用了BASS之類的外部DLL,然后使用這些庫提供的.NET包裝器代碼來訪問其MP3。 但是,我過去曾經使用過BASS,如果您打算出售軟件,它不是免費使用的。 另外,我使用它的代碼將MP3拆包到當前文件夾中,並從那里開始播放它們,由於文件系統的限制,您要避免這種情況。

我不確定為什么微軟會禁止這樣做,但是如果您在此處閱讀“備注”部分的第二段,您會發現在將媒體文件與可執行文件捆綁在一起方面存在一些阻力。

也許最簡單的解決方案是將MP3文件寫入允許寫入的目錄,例如臨時文件夾。 請嘗試以下操作:


Imports System.IO

Dim tempDir As String = Path.GetTempPath() and see if you can 
My.Computer.FileSystem.WriteAllBytes(tempDir, My.Resources.ResourceManager.GetObject("SongNameHere"), False)

---”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM