Захват звука с низкой задержкой с помощью gstreamer

Мне нужен (почти) захват звука в реальном времени в Linux с gstreamer. Моя проблема в том, что я не могу уменьшить задержку ниже ~ 210 мс. Я пробовал простой шлейф от микрофона к наушникам:

gst-launch-1.0 pulsesrc ! alsasink
gst-launch-1.0 alsasrc ! alsasink

Оба произвели одинаковую задержку. Свойство latency-time alsasrc не помогло (оно добавило заданную задержку). Я мог произвести нужный мне эффект с помощью

pactl load-module module-loopback latency_msec=1

Но я так и не понял, можно ли установить задержку устройства для pulsesrc плагина gstreamer. Думаю, если это возможно, я должен добавить что-нибудь в stream-properties, но не мог понять, что (искал здесь) и как.

Можно ли установить задержку этого устройства для каких-либо gstreamer источников, и если да, то как?


person gertom    schedule 03.02.2017    source источник
comment
некоторые из этих аудиобиблиотек (разъем) предлагают опцию в реальном времени во время установки ... вы видели такую ​​опцию? ... это не по умолчанию, поскольку он передает приоритет обработке звука в ущерб неаудио процессам   -  person Scott Stensland    schedule 03.02.2017
comment
Может быть, вы хотите проверить задержку на уровне ALSA и посмотреть, может быть, это скорее вопрос ALSA, чем вопрос GStreamer? alsa-project.org/main/index.php/Test_latency.c < / а>   -  person mpr    schedule 07.02.2017
comment
Я также вижу, что на alsasrc есть свойство buffer-time, которое вы можете попробовать. Значение по умолчанию - 200000 микросекунд, что подозрительно похоже на задержку, которую вы видите.   -  person mpr    schedule 07.02.2017
comment
Я уверен, что система способна работать с малой задержкой, поскольку pactl работал, и программа тестирования задержки alsa также сообщает о задержках 2 мс. Но ни установка свойств buffer-time (я также обнаружил это ранее), ни latency-time alsasrc не имеют желаемого эффекта. (При низком buffer-time звук обратной петли начинает давать сбои, и latency-time может увеличиваться, но не может уменьшить задержку.)   -  person gertom    schedule 08.02.2017


Ответы (2)


Использование импульсного источника вместо alsasink может решить проблему. Попробуй это:

gst-launch-1.0 -v alsasrc buffer-time=35000 !  pulsesink
person Tibor Bakota - FrontEndART    schedule 23.02.2017

Примерно максимально возможное значение нулевой задержки по сети составляет около 20 мс. В этом примере создается тот же поток RTP, что и при вызове VoIP с максимальным временем ptime 20 в протоколе описания сеанса. Первый конвейер - это говорящий, а второй конвейер - это слушатель. Я не тестировал это с более низкими задержками или с локальной раковиной, если на то пошло, но настройка существует для ваших целей.

оратор

gst-launch alsasrc name=mic provide-clock=true actual-buffer-time=20000 do-timestamp=true buffer-time=20000 \
mic. \
! alawenc \
! rtppcmapay max-ptime=20000000 \
! udpsink host=192.168.1.2 port=5000

слушатель

gst-launch udpsrc port=5000 caps="application/x-rtp, media=(string)audio, clock-rate=(int)8000, encoding-name=(string)PCMA" \
! rtppcmadepay \
! audio/x-alaw, rate=8000, channels=1 \
! alawdec \
! alsasink buffer-time=80000
person Josiah DeWitt    schedule 14.02.2017