LINUX.ORG.RU
ФорумAdmin

Запись звука по превышению порога чувствительности

 ,


1

1

День добрый. Встала у меня задача записывать в круглосуточном режиме звук с микрофона и линейного входа. По микрофону запись нужна в круглосуточном режиме, а по линейному входу - по превышению порога чувствительности (стоит радиостанция и необходимо писать не весь эфир, а только сеансы связи по рациям). По достижению определенного объема записанных данных, запись должна перезаписываться в циклическом режиме. Почитал про PulseAudio и arecord, как записать понятно, а вот как реализовать описанный выше функционал - у самого мозгов не хватает. Возможно у кого-нибудь есть какие-нибудь скриптовые наработки или идеи в какую сторону гуглить?

Наверно стоит взять sox - http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/ (статья старая, но думаю принцип там не поменялся).

На счет ротации (удаления) файлов - если это не получится сделать в рекордере то можно натравить на файлы logrotate.

alozovskoy ★★★★★
()

По достижению определенного объема записанных данных, запись должна перезаписываться в циклическом режиме.

cron + find позволит удалить старые записи если их раскладывать отдельными файлами.

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 2)

В ffmpeg есть фильтр silencedetect.

Ещё посмотри на формат '-segment' и его опции (ниже). Есть возможность выбирать любую длительность сегментов, сразу же их перезаписывать при достижении лимита, а также можно сразу создавать плейлисты.

Кодек, разумеется, можно выбрать любой. Хоть mp3, хоть попсовый opus.

То есть, твоя команда для записи с «вырезанием» тишины будет выглядеть как-то так:

ffmpeg -f pulse -i 0 -af silencedetect=noise=-40dB -f segment -segment_time 600 out_%06d.aac

Я не проверял и не гарантирую. '-segment_time' в секундах. Итоговый формат определяется по расширению (в примере — .aac). Если надо моно, то поставь где-нибудь '-ac 1'. Вообще, у ffmpeg много параметров.

anonymous
()
Ответ на: комментарий от anc

Пожалуйста, конечно. Но я прогнал. Попробовал сейчас. Оказывается фильтр 'silencedetect' только детектит тишину. Нужен, очевидно, 'silenceremove'.

Вот эта команда, вроде, неплохо срабатывает на тишину:

ffmpeg -f pulse -i 1 -af silenceremove=0:0:-20dB:-1:1:-20dB:1 -f segment -segment_time 10 out_%06d.aac

'-i 1' — это я с плеера записываю. Два порога для 'silenceremove' — это начало срабатывания и конец. То есть, видимо, можно задать гистерезис.

silenceremove=
  0        - не нужно (оставить 0)
 :0        - не нужно (оставить 0)
 :-20dB    - порог тишины
 :-1       - не нужно (оставить -1)
 :1        - длительность тишины, после которой перестаёт идти запись
 :-20dB    - порог сигнала
 :1        - надо ли оставлять тишину (1 — да, 0 — нет)

Если я всё правильно понял.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.