为什么运行媒体播放器可以消除VB.NET应用程序的音频延迟



我在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学习版
OS:Vista sp2 x86/Windows 7 x64

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

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

没有办法完全远程延迟。数字音频不是这样工作的。但是,您可以通过使用ASIO或类似功能来显著降低它。

最新更新