Остановите воспроизведение mp3-файла, как только уровень громкости mp3-файла опустится ниже порогового значения.

Я хочу воспроизвести mp3-файл в С#. Форма должна иметь кнопки запуска и остановки.

Когда пользователь нажимает кнопку остановки, воспроизведение останавливается не сразу, а когда текущая громкость воспроизведения становится ниже определенного порога, другими словами, когда в mp3 - файле наступает "тишина" в течение заданного минимального времени.

Что было бы эффективным способом сделать это?

мне нужно знать

  1. Какую dll/импорт использовать для воспроизведения mp3-файла
  2. Как получить текущий уровень громкости воспроизводимого файла, используя ту же dll из «1». целое число, число с плавающей запятой или двойное число.

Имея ответы на эти два вопроса, я могу продолжить самостоятельно.

PS: я не хочу знать, где тишина в файле вообще. Мне нужна функция, которая сообщает мне, есть ли сейчас тишина. Поэтому я передаю ему несколько байтов потока и порог, и он возвращает true или false.


person Peter Fren    schedule 29.10.2012    source источник


Ответы (1)


Вы не указали, что вы используете для воспроизведения MP3. Но я использую для этого BASS. Ваш вопрос был задан на их форуме. Здесь это. Кстати, вам может понадобиться BASS .NET, который оболочка .NET для BASS, чтобы использовать BASS с C#.

Изменить в связи с изменением в вопросе:

Вы можете использовать bass.dll по ссылке, которую я дал выше. Загрузите оболочку .NET, добавьте ее в свои ссылки. Вот пример в VB 6. Просто замените длинные числа на целые, а целые на короткие, имена функций одинаковы. Вы должны получить идею отсюда.

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

Кроме того, если вы хотите исчезнуть, это еще одна простая история.

person theGD    schedule 29.10.2012
comment
Я не хочу знать, где тишина в файле вообще. Мне нужна функция, которая сообщает мне, есть ли сейчас тишина. Поэтому я передаю ему несколько байтов потока и порог, и он возвращает true или false. - person Peter Fren; 29.10.2012