如何同时播放 2 种不同的声音?(Visual basic)
Posted
技术标签:
【中文标题】如何同时播放 2 种不同的声音?(Visual basic)【英文标题】:How to play 2 different sounds at the same time?(Visual basic) 【发布时间】:2015-04-15 12:53:34 【问题描述】:我有一个关于游戏的问题。当您单击按钮时,我想播放背景声音和另一种声音。发生这种情况时,背景声音停止,第二声音开始。当第二个声音结束时,不会播放任何声音。
你可以在下面看到我的代码:
Imports System.Media.SoundPlayer
Public Class GamePlaying
Dim mainmenusndplayer As New System.Media.SoundPlayer
Private Sub GamePlaying_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
MainMenu.Show()
mainmenusndplayer.Stop()
End Sub
Private Sub btn_Fire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Fire.Click
btn_Fire.Enabled = False
Dim shotsound As New System.Media.SoundPlayer
shotsound.Stream = My.Resources.TankShoot
shotsound.Play()
End Sub
Private Sub GamePlaying_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
mainmenusndplayer.Stream = My.Resources.WoT_Roll_Out
mainmenusndplayer.Load()
mainmenusndplayer.PlayLooping()
End Sub
End Class
【问题讨论】:
我对音频片段不是很自信,但这听起来像是线程化的案例——我在这里找到了一个 C# 示例——***.com/questions/6240002/… Play multiple sounds using SoundPlayer的可能重复 这个问题已经有了答案:***.com/questions/1285294/…。此外,这不是线程问题 - SoundPlayer.Play 已经是异步的。 【参考方案1】:我一直在为同样的问题苦苦挣扎.....
简短的回答是你不能。在任何给定进程中,系统将只允许一个通道连接到声音接口。因此,当您开始一个新声音时,前一个声音会终止。
有许多变通方法主要使用 Direct-X 或 Media-Player。但是,我发现这些解决方案都不是简单或强大的,因为您依赖于用户机器来安装正确的东西。
但是,我找到了一个快速简单的解决方案。
我在我的应用程序中添加了一个特殊的“挂钩”,这样当我使用适当的命令行参数运行它时,它所做的只是播放特定的声音并退出。然后,我使用进程对象启动另一个应用程序实例,并带有适当的参数.. 嘿 presto.. 多种声音。
如果您的应用程序被配置为自动成为单个实例,您需要禁用它并用一小段代码替换它以检测另一个实例并退出。
另一种选择是在您的应用程序包中添加一个小 exe,它只执行声音部分。
我知道这听起来不太“纯粹”,但实际上,您所做的只是启动一个在后台播放声音的过程。该进程是 Windows 原生函数还是您自己创建的函数并不重要。
【讨论】:
【参考方案2】:您可以将 winmm.dll 与 mciSendString 一起使用:
Imports System.Text
Imports System.Runtime.InteropServices
<DllImport("winmm.dll")>
Private Shared Function mciSendString(ByVal command As String, ByVal buffer As
StringBuilder, ByVal bufferSize As Integer, ByVal hwndCallback As IntPtr) As Integer
End Function
Private Sub MyForm_Click(sender As Object, e As EventArgs) Handles Me.Click
mciSendString("open " & Chr(34) & "C:\myFile1.wav" & Chr(34) " type waveaudio alias Sound1" & internalName, Nothing, 0, IntPtr.Zero)
mciSendString("open " & Chr(34) & "C:\myFile2.wav" & Chr(34) " type waveaudio alias Sound2" & internalName, Nothing, 0, IntPtr.Zero)
mciSendString("play Sound1", Nothing, 0, Me.Handle.ToInt64())
mciSendString("play Sound2", Nothing, 0, Me.Handle.ToInt64())
mciSendString("setaudio Sound1 volume to 1000", Nothing, 0, Me.Handle.ToInt64())
mciSendString("setaudio Sound2 volume to 1000", Nothing, 0, Me.Handle.ToInt64())
End Sub
要停止声音,您必须:
mciSendString("close Name1", Nothing, 0, Me.Handle.ToInt64())
mciSendString("close Name2", Nothing, 0, Me.Handle.ToInt64())
在 https://www.dll-files.com/winmm.dll.html
下载 winmm.dll【讨论】:
以上是关于如何同时播放 2 种不同的声音?(Visual basic)的主要内容,如果未能解决你的问题,请参考以下文章