gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:18:43 24 4
gpt4 key购买 nike

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

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

什么是有效的方法?

我需要知道

  • 用于播放mp3文件的dll / import
  • 如何使用“1”中的相同dll获取正在播放的文件的当前音量级别。 为整数,浮点数或 double

  • 对于这两个问题,我可以自己继续回答。

    PS:我通常不希望在文件中的静音位置。我想要一个函数,该函数可以告诉我现在是否寂静。因此,我将一些流的字节传递给它和一个阈值,并返回true或false。

    最佳答案

    您没有指定用于播放MP3的内容。但是我正在使用BASS。您的问题在他们的论坛中被问到。这里it is。顺便说一句,您可能需要BASS .NET(它是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

    另外,如果您想淡入淡出,那就是另一个又简单的故事。

    关于c# - 一旦mp3文件的音量低于阈值,就停止播放mp3文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114516/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com