1

在我的 VB.NET 应用程序中播放作为资源嵌入的 wav 文件(0.034 秒长)时,我遇到了一个奇怪的问题。

我的应用程序应该在按下按钮时异步循环声音,并在释放按钮时停止声音。

问题是按钮被快速按下和释放时似乎有延迟,尤其是在连续多次单击的情况下。

这种延迟使音频听起来断断续续,它还会挂起应用程序,直到对 play() 和 stop() 的调用队列结束。

但是,我注意到如果在运行我的应用程序时同时运行音频播放器(播放声音文件或暂停,而不是停止),延迟或延迟就消失了。

我测试过的播放器有:Windows Media Player、Windows Media Player Classic - Home Cinema、Foobar2000 和 QuickTime。

这是代码:

Option Explicit On
Option Strict On

Public Class frmMain

    Private btnPlayPressed As Boolean

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        btnPlayPressed = False
    End Sub

    Private Sub btnPlay_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnPlay.MouseDown
        If Not btnPlayPressed Then
            My.Computer.Audio.Play(My.Resources.Beep, AudioPlayMode.BackgroundLoop)
            btnPlayPressed = True
        End If
    End Sub

    Private Sub btnPlay_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnPlay.MouseUp
        If btnPlayPressed Then
            My.Computer.Audio.Stop()
            btnPlayPressed = False
        End If
    End Sub

    Private Sub btnPlay_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles btnPlay.KeyDown
        If e.KeyCode.Equals(Keys.Space) Then
            btnPlay_MouseDown(sender, Nothing)
        End If
    End Sub

    Private Sub btnPlay_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles btnPlay.KeyUp
        If e.KeyCode.Equals(Keys.Space) Then
            btnPlay_MouseUp(sender, Nothing)
        End If
    End Sub

End Class

我还使用了 VB.NET 中提供的各种其他音频功能,它们都有这个问题,但我坚持使用 My.Computer.Audio,因为它简单易读。

为什么运行音频播放器会消除 My.Computer.Audio.play 的延迟?
有没有办法从我的代码中消除延迟?

其他详细信息:
IDE:Visual Studio 2010 Express
操作系统:Vista sp2 x86/Windows 7 x64

4

1 回答 1

0

这可能有几个原因。第一个可能是其他软件专门降低了播放缓冲区的大小。完成此操作后,延迟会降低。

第二个原因可能与采样率有关。如果以字节为单位设置缓冲区大小并且采样率加倍,则该缓冲区的持续时间是原来的一半。如果您在应用程序中以一定的速率播放音频,而其他软件以不同的速率播放,那么 Windows 的音频混合服务可能会以不同的方式调整缓冲区。

没有办法完全远程延迟。这不是数字音频的工作方式。但是,您可以通过使用 ASIO 或类似工具来显着减少它。

于 2012-12-09T06:06:14.250 回答