一旦mp3文件的音量低于阈值,就停止播放mp3文件

时间:2012-10-29 00:28:23

标签: c# audio naudio

我想在c#中播放一个mp3文件。表单应该有一个开始和停止按钮。

当用户点击停止按钮时,播放不会立即停止,但是当前播放音量低于某个阈值时,换句话说,当mp3文件中出现“静音”时,给定的最短时间。

这样做的有效方法是什么?

我需要知道

  1. 使用哪个dll / import播放mp3文件
  2. 如何使用“1”中的相同dll获取正在播放的文件的当前音量级别为整数,浮点数或双精度
  3. 我可以自己继续回答这两个问题。

    PS:我不想知道文件中的静音在哪里。我想要一个能告诉我现在是否有沉默的功能。所以我将一些流的字节传递给它和一个阈值,它返回true或false。

1 个答案:

答案 0 :(得分:1)

您没有指定播放MP3的用途。但我正在使用BASS。您的问题在他们的论坛中被问到。这里it is。顺便说一句,您可能需要{B {3}},它是BASS的.NET包装器,可以使用BASS和C#。

由于问题的变化而进行编辑:

您可以在我上面给出的链接中使用bass.dll。下载.NET包装器,将其添加到您的引用中。这是VB 6中的一个例子。只需将long更改为整数,将整数更改为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

此外,如果你想要褪色,这是另一个简单的故事。