我想在c#中播放一个mp3文件。表单应该有一个开始和停止按钮。
当用户点击停止按钮时,播放不会立即停止,但是当前播放音量低于某个阈值时,换句话说,当mp3文件中出现“静音”时,给定的最短时间。
这样做的有效方法是什么?
我需要知道
我可以自己继续回答这两个问题。
PS:我不想知道文件中的静音在哪里。我想要一个能告诉我现在是否有沉默的功能。所以我将一些流的字节传递给它和一个阈值,它返回true或false。
答案 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
此外,如果你想要褪色,这是另一个简单的故事。