1

c# で mp3 ファイルを再生したい。フォームには開始ボタンと停止ボタンが必要です。

ユーザーが停止ボタンをクリックしても、再生はすぐには停止しませんが、現在の再生音量が特定のしきい値を下回った場合、つまり、mp3 ファイルで「無音」が発生した場合は、指定された最小時間になります。

これを行う効率的な方法は何ですか?

私は知る必要がある

  1. mp3 ファイルの再生に使用する dll/インポート
  2. 「1」から同じ dll を使用して、再生中のファイルの現在の音量レベルを取得する方法。integer、float、または double として

この 2 つの質問に対する答えがあれば、自分で進めることができます。

PS: 一般的に、無音部分がファイルのどこにあるのか知りたくありません。今無音かどうか教えてくれる機能が欲しい。したがって、いくつかのストリームのバイトとしきい値を渡すと、true または false が返されます。

4

1 に答える 1

1

MP3 の再生に使用しているものを指定しませんでした。しかし、私はそのためにBASSを使用しています。あなたの質問は彼らのフォーラムで尋ねられました。ここにあります。ところで、 C# で BASS を使用するには、BASS の .NET ラッパーであるBASS .NETが必要になる場合があります。

問題の変更による編集:

上記のリンクで bass.dll を使用できます。.NET ラッパーをダウンロードし、参照に追加します。VB 6 の例を次に示します。long を integer に、integer を short に変更するだけで、関数名は同じになります。ここからアイデアを得る必要があります。

Public Sub GetSilenceLength(ByVal file As String, ByVal threshold As Long, ByRef startp As Long, ByRef endp As Long)
   Dim buf(50000) As Integer
   Dim count As Long, pos As Long
   Dim chan As Long
   Dim a As Long, b As Long
   Dim c As Long, d As Long
   count = 0

   chan = BASS_StreamCreateFile(BASSFALSE, file, 0, 0, BASS_STREAM_DECODE) 'create decoding channel

   If (chan = 0) Then Exit Sub

   Do
         b = BASS_ChannelGetData(chan, buf(0), 20000) 'decode some data
         b = b / 2 'bytes -> samples
         a = 0
         Do      'count silent samples
               a = a + 1
         Loop While ((a < b) And (Abs(buf(a)) <= threshold))
         count = count + (a * 2)
         If (a < b) Then 'sound has bagun
               'move back to a quieter sample (to avoid "click")
               Do
                     a = a - 1
                     count = count - 2
               Loop While ((a) And (Abs(buf(a)) > threshold / 4))
               Exit Do
         End If
   Loop While (BASS_ChannelIsActive(chan))

   startp = count

   pos = BASS_StreamGetLength(chan)
   Do
         pos = IIf(pos < 100000, 0, pos - 100000) 'step back a bit
         BASS_ChannelSetPosition chan, pos
         d = BASS_ChannelGetData(chan, buf(0), 100000) ' decode some data
         d = d / 2 'bytes -> samples
         c = d
         Do
               c = c - 1  'count silent samples
         Loop While (c > 0) And (Abs(buf(c)) <= threshold / 2) 'Here is the correction
         If (c > 0) Then   'sound has begun
               count = pos + c * 2
               Exit Do
         End If
   Loop While (pos > count)
   endp = count
   BASS_StreamFree (chan)
End Sub

また、フェードが必要な場合は、別のまだ簡単な話です.

于 2012-10-29T00:37:30.683 に答える