【问题标题】:Why does having a media player running removes audio latency of my VB.NET application?为什么运行媒体播放器会消除我的 VB.NET 应用程序的音频延迟?
【发布时间】:2012-11-26 22:19:52
【问题描述】:

在播放作为资源嵌入到我的 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

【问题讨论】:

    标签: vb.net audio latency


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。我认为这确实与缓冲区大小有关。我尝试使用 ASIO,但对于这样一个简单的任务,它似乎过于复杂,而是我使用了 XNA(因为现在不推荐使用托管 Direct X),特别是 Microsoft.Xna.Framework.Audio.SoundEffect API;它使用起来超级简单,它甚至接受我的声音资源作为 IO.Stream。由于 XNA 是为游戏设计的,因此我的应用程序现在没有明显的延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多