如何同时播放 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.dllmciSendString 一起使用:

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)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上异步和同时(复音)播放声音?

在javascript中同时播放多个声音

如何同时播放两种声音?

同时播放多个 SoundPool

vb.net中如何播放声音,是要啥控件嘛?

使用 naudio 动态播放音频文件