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
OS: Vista sp2 x86/ Windows 7 x64

4

1 に答える 1

0

これにはいくつかの理由が考えられます。1 つ目は、他のソフトウェアが再生用のバッファ サイズを特に小さくしている可能性があります。これが完了すると、遅延が少なくなります。

2 番目の理由は、サンプリング レートに関係している可能性があります。バイト単位で設定されたバッファー サイズがあり、サンプル レートが 2 倍になると、そのバッファーは半分の長さになります。アプリケーションで特定のレートでオーディオを再生していて、他のソフトウェアが別のレートで再生している場合、おそらく Windows のオーディオ ミキシング サービスがバッファを別の方法で調整します。

遅延を完全にリモートする方法はありません。それはデジタルオーディオの仕組みではありません。ただし、ASIO などを使用することで大幅に削減できます。

于 2012-12-09T06:06:14.250 に答える