【问题标题】:How to play a sound while another sound is already playing - VB.NET 2010如何在另一个声音已经播放时播放声音 - VB.NET 2010
【发布时间】:2020-07-07 00:13:17
【问题描述】:

好的,所以上周我一直在努力解决这个问题。

当您将鼠标悬停在 2 个单独的图像/标签上时,我需要播放声音。 如果您很快将光标放在两个图像/标签上,声音需要播放两次并且能够相互重叠,它不能等待第一个声音停止播放第二个声音。 此外,两个图像/标签都需要从存储在我的 AppData 中的同一个 .WAV 音频文件中提取,这意味着它需要播放同一个 .WAV 文件,但是需要多次播放,并且根据您移动的速度尽可能多地重叠将光标悬停在图像/标签上。

我已经尝试了以下所有方法。

DirectX.AudioVideoPlayback 函数使用 DIM 中的文件路径。 DirectX.DirectSound 函数。 (不记得我尝试过的所有方法)。 Media.SoundPlayer 函数的路径存储在 "player.SoundLocation = "PATH" 中,就在您调用该行为播放文件之前。 My.Computer.Audio.Play("PATH").

我尝试过 mciSendString,我尝试过多次将播放代码封装在一个线程 (Threading.Thread(AddressOf NewSub)) 中...我玩过背景声音...

请!如果有人能帮忙,我会想办法报答你的。

谢谢!!

【问题讨论】:

  • 使用可让您获得更多控制权的音频库,例如 BASS.NET,例如 bass.radio42.com

标签: vb.net directx directsound audiovideoplayback mcisendstring


【解决方案1】:

通过使用 BASS.Net(Bass 的 .net 包装器),您可以同时播放数百种声音 只需使用此代码: 首先你初始化低音

Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, System.IntPtr.Zero)

然后你声明它流的一个整数名称,这就是你将用来控制流的那个。

    Dim stream As Integer

现在您需要将文件加载到流中

 stream = Bass.BASS_StreamCreateFile(FILELOCATION, 0, 0, BASSFlag.BASS_SAMPLE_FLOAT)

如果你想循环流,你可以使用这个

 If (Bass.BASS_ChannelFlags(stream, BASSFlag.BASS_DEFAULT, BASSFlag.BASS_DEFAULT) And BASSFlag.BASS_SAMPLE_LOOP) = BASSFlag.BASS_SAMPLE_LOOP Then
            ' loop flag was set, so remove it
            Bass.BASS_ChannelFlags(stream, BASSFlag.BASS_DEFAULT, BASSFlag.BASS_SAMPLE_LOOP)
        Else
            ' loop flag was not set, so set it
            Bass.BASS_ChannelFlags(stream, BASSFlag.BASS_SAMPLE_LOOP, BASSFlag.BASS_SAMPLE_LOOP)
        End If

要控制流使用这些: 播放Bass.BASS_ChannelPlay(stream, False) 注意第二个参数(布尔值)用于使流从乞求播放或继续播放 暂停Bass.BASS_ChannelPause(stream) 停止Bass.BASS_ChannelStop(stream)

如果您需要进一步的帮助,请询问我,我在使用 Bass.net 时拥有丰富的经验 ^^

如果我的回答确实对您有所帮助,请不要忘记将其标记为答案,以便对整个社区有所帮助;)

【讨论】:

  • 感谢您的回复,阿内斯!我不介意这种方法,但是我试图远离 3rd 方 API,因为我不想添加更多资源和额外的分发限制。有没有办法使用 DirectX 或内部声音播放器来解决这个问题?再次感谢!
  • 是的,你当然可以使用 DirectX 或 My.Computer.Audio.Play("Location", "ChooseAudioPlayMode"),但这不会给你太多控制,因为你不能使用基本的控制,比如播放/暂停/位置操作,我没有太多的知识关于 DirectX 但由于您不是在寻找控件,因此您可以使用 My.Computer.Audio.Play 它很流畅并且可以与之前的播放声音重叠,尝试一下并告诉我您得到了什么^^,PS:在标签或图像上使用 MouseEnter 事件
  • 所以,我只是再次尝试My.Computer.Audio.Play,声音不会重叠。我有一个理论,为了让它重叠,我应该使用 2 个相同的音频文件从不同的按钮调用吗?这是否会使音频文件重叠,并且看起来像是 1 个音频文件播放两次并相互重叠?
  • 抱歉我之前的评论我不明白重叠是什么意思,谷歌翻译没有给我太多帮助,My.Computer.Audio.Play即使你有不同的音频源也不能重叠,因为你打电话同一个线程中的同一个类,您只是在调用它两次时重置该类的内部媒体播放器,您仍然可以使用低音音频库重叠。尝试这些有希望的示例,它们可能会有所帮助1/2
【解决方案2】:

您可以使用mciSendString实现多个声音同时播放,只是使用不同的声音名称。 让声音在稍后触发时与自身重叠。 Yo 可能会使用不同的声音名称加载相同的声音,这可能需要一些设计。 目前,MCISendString 仅支持播放一个 MIDI 音序器,同时播放多个 wav/mp3 声音。 mciSendString 的一个缺点是它的文件名长度有限 (

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多