1

VB Express 2012 (VB.net) を使用して、.wav 効果音と .mp3 バックグラウンド ミュージックを持つ学校での教育用ゲームを作成しています。私のコードを以下に示します。どのパソコンでも問題なく動作しますが、WMPLib.WindowsMediaPlayer を使用して mp3 を再生する方法が原因で、アプリケーション実行ファイルを含むフォルダーへのファイルの書き込み/削除の許可が与えられていないコンピューターでは問題が発生します。wmp は mp3 ファイル用の外部ファイルへの URL を必要とするため (なぜ???)、my.resource フォルダーからクライアント コンピューターに mp3 ファイルを書き込んで有効な URL を取得し、プログラムを閉じるときにそれらを削除する必要があります。許可が与えられていない場合、これは失敗します。

ファイルをクライアント コンピューターに書き込む必要がない wmp.dll を使用して、リリースされたアプリケーションの my.resources から mp3 ファイルを再生する別の方法はありますか?   おそらくある種のストリーミング?私はこれまでその領域を掘り下げたことはありませんでした。ところで、アプリケーションのサイズが大きすぎるため、mp3 を wav ファイルに変換するのは無理があります。(私のコードスニペットは例として 1 つだけを示していますが、私は多くの 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

 

そして、念のため、.formclose で次のコードを使用して曲を削除します。

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

1 に答える 1

0

次の回避策を提供してくれた D. Digaetano 氏に感謝します (重要な解決策は太字で示されています)。

「....NET でリソースがパックされた MP3 ファイルをネイティブに再生する方法はありません。C# でも許可されていません。

MP3 ファイルを取得する唯一の方法は、リソースで動作するストリームを作成することですが、Windows Media Player ActiveX オブジェクトはストリームを入力としてサポートしていません。

多くの人は、BASS などの外部 DLL を使用し、それらのライブラリで提供される .NET ラッパー コードを使用して MP3 にアクセスしているようです。ただし、私は過去に BASS を使用したことがあり、ソフトウェアを販売する場合は無料では使用できません。また、それを使用した私のコードは、MP3 を現在のフォルダーに解凍し、そこから再生するだけでした。これは、ファイル システムの制限により回避したかったことです。

Microsoft がこれを禁止する理由はわかりませんが、ここの「備考」セクションの 2 番目の段落を読むと、実行可能ファイルにメディア ファイルをバンドルすることに抵抗があることがわかります。

おそらく最も簡単な解決策は、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)

---」

于 2014-09-09T16:35:52.373 に答える