Как обнаружить тишину звука в буфере потока WMA? - PullRequest
0 голосов
/ 24 августа 2010

Я надеюсь, что вы можете помочь мне с программой, которую я пытаюсь написать в VB.NET.

У меня есть стандартный поток WMA, который постоянно транслируется через Интернет.Мне нужно написать приложение для потоковой передачи этого аудио, и ищет любые периоды «молчания».Когда он обнаруживает тишину, он запускает событие.

Для целей этого молчание определяется как три секунды звука нулевого уровня.Поток продолжает идти в техническом смысле, но сквозь него нет слышимого шума.

Однако я хочу, чтобы программа обнаружила тишину, пока она все еще находится в «буфере».То есть пользователь не услышит это молчание, пока программа не обнаружит, что оно есть.

Звук не должен останавливаться, когда он анализирует это молчание - ему необходимо постоянно воспроизводить аудио для пользователя.

Я открыт для использования любого подходящего API - например, BASS или расширений Windows Media, встроенных в платформу dot net.

Спасибо !!

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Если у вас есть данные PCM, вы можете просто взять в среднем несколько выборок, и, если они ниже порогового значения, считайте это молчанием. Я предполагаю, что если вы воспроизводите аудио, у вас есть доступ к несжатым данным.

К сожалению, я не знаю деталей кодека WMA, но я думаю, что самый простой способ - просто взять среднее значение из нескольких выборок.

0 голосов
/ 02 сентября 2010

Что ж, я делаю именно это в моем продукте: несколько аудиопотоков в Интернете записываются и декодируются в PCM, а затем выполняется различный анализ, один из которых обнаруживает тишину.

Если вы хотите создать что-то подобное, используйте Windows Media Format SDK для .net отсюда:

http://windowsmedianet.sourceforge.net/

Затем используйте IWMReader и обратный вызов OnSample, который предоставит вам данные PCM.

Затем рассчитайте максимальные уровни входного сигнала для небольших буферов, просмотрите этот уровень на 3 секунды и, если он ниже вашего порога, запустите событие.

...