如何同时播放2种不同的声音?(Visual Basic)

时间:2015-04-15 12:53:35

标签: vb.net audio playback

我对游戏有疑问。当您单击按钮时,我想播放背景声音和另一种声音。发生这种情况时,背景声音停止,第二个声音开始。当第二个声音结束时,不会播放声音。

您可以在下面看到我的代码:

    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

2 个答案:

答案 0 :(得分:0)

我一直在努力解决同样的问题......

简短的回答是你不能。系统将仅允许在任何给定过程中一个声道到声音接口。因此,当您开始播放新声音时,前一个声音将终止。

有许多解决方法主要使用Direct-X或Media-Player。但是,我发现这些解决方案既不简单也不健壮,因为您依赖于用户计算机来安装正确的东西。

然而,我找到了解决问题的快速而简单的方法。

我在我的应用程序中添加了一个特殊的“钩子”,这样当我使用适当的命令行参数运行它时,它所做的就是播放一个特定的声音然后退出。然后我使用进程对象用适当的参数启动应用程序的另一个实例..并且嘿presto ..多个声音。

如果您的应用程序配置为自动成为单个实例,则需要禁用该应用程序并将其替换为少量代码以检测另一个实例并退出。

另一种方法是在您的应用程序包中添加一个小的exe,它只是简单地执行声音部分。

我知道这听起来不是很“纯粹”,但实际上,你所做的只是开始一个在后台播放声音的过程。如果该过程是Windows本机功能或您自己制作的功能并不重要。

答案 1 :(得分:0)

您可以将 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