5

私は次のコードを持っています: http://pastebin.com/EgjbzqA2これは基本的にhttp://www.dreamincode.net/forums/topic/57357-mymusic-player/の単純なバージョンです。1つのファイルを繰り返し再生させたいのですが、なぜか機能しません。プログラムは各ファイルを 1 回再生してから停止します。

Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange
    Static Dim PlayAllowed As Boolean = True
    Select Case CType(NewState, WMPLib.WMPPlayState)
        Case WMPLib.WMPPlayState.wmppsReady
            If PlayAllowed Then
                Player3.controls.play()
            End If
        Case WMPLib.WMPPlayState.wmppsMediaEnded
            ' Start protection (without it next wouldn't play
           PlayAllowed = False
            ' Play track
           Player3.controls.play()
            ' End Protection
           PlayAllowed = True
            updatePlayer()
    End Select
End Sub
4

2 に答える 2

1

PlayAllowed doo-wop は、イベントで何か他のことをするように要求したときにコントロールが不機嫌になるのを回避するためのハッコラマです。これはよく失敗します。イベントを起動したときにフロア マットが急に動くことを期待していません。専門用語は、非常に一般的な問題である再入可能性をうまく処理できないということです。

再入の問題に対する非常に洗練された解決策があります。重要なのは、イベントが発生した、同じ曲を再度再生するリクエストを遅らせることです。Winforms では、Control.BeginInvoke() を使用してこのような遅延を簡単に取得できます。ターゲットは、すべてが落ち着いた後に実行されます。そのための専門用語は、「プログラムがメッセージループに再び入るのを待つ」です。このコードでは非常にうまく機能しました。Windows 8 でテストしたこのコードを使用して、同じ曲を何度もループしても問題はありませんでした。

Public Class Form1
    Dim WithEvents Player3 As New WMPLib.WindowsMediaPlayer
    Dim Song As String = "c:\temp\ding.wav"

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PlayCurrentSong()
    End Sub

    Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange
        If NewState = WMPLib.WMPPlayState.wmppsMediaEnded Then
            Me.BeginInvoke(New MethodInvoker(AddressOf PlayCurrentSong))
        End If
    End Sub

    Private Sub PlayCurrentSong()
        Player3.URL = Song
        Player3.controls.play()
    End Sub
End Class

あなたのコードとはあまり一致しないので、必要に応じてコードを微調整してください。重要な部分は、PlayStateChanged イベント ハンドラーでの Me.BeginInvoke() 呼び出しです。

于 2012-12-09T22:55:48.040 に答える
0

私はこれを調べますが、問題はあなたがそうしようと一生懸命に努力していることです。カプセル化された MP3 プレーヤー ファイルの内容を分析すると、サウンド バリアがバイナリ デジタルではなくアナログ ファイルに変換されていることがわかります。この問題は、ビデオオーディオ再生と言うように「WMP」にのみ割り当てられた場合です。オペレーティング システムを切り替えると動作する可能性がありますが、まず新しいコンピューターを購入してから、代わりに使用します。ありがとうございます :)

于 2012-12-08T00:39:38.743 に答える