перемещение звука по локальной сети с помощью GStreamer - PullRequest
3 голосов
/ 26 апреля 2010

Мне нужно перемещать звук в реальном времени между двумя компьютерами Linux, на которых оба работают под заказ (мое), которое основано на Gstreamer. (У программного обеспечения уже есть другая связь между машинами по отдельному протоколу на основе TCP - я упоминаю об этом в случае, если наличие надежных внеполосных данных имеет значение для решения).

Аудиовход будет представлять собой микрофон / линейный вход на отправляющем аппарате, а обычный аудиовыход будет использоваться как приемник в пункте назначения; alsasrc и alsasink являются наиболее вероятными, хотя для тестирования я использовал audiotestsrc вместо реального микрофона.

GStreamer предлагает множество способов перемещения данных по сетям - RTP, RTSP, полезная нагрузка GDP, серверы UDP и TCP, клиенты и сокеты и так далее. В Интернете также есть много примеров потоковой передачи аудио и видео, но на практике ни один из них мне не подходит; Либо конвейер назначения не может согласовать ограничения, либо я слышу один пакет, и затем конвейер останавливается, или конвейер назначения выдается немедленно без доступных данных.

Во всех случаях я тестирую в командной строке просто gst-launch. Сжатие аудиоданных не требуется - подходит чистое аудио или обычное кодирование WAV, uLaw или aLaw; что более важно, это низкая задержка.

Ответы [ 3 ]

5 голосов
/ 28 апреля 2010

Чтобы решить эту проблему, я бы попробовал:

  1. Запустите gst-launch audiotestsrc ! alsasink, чтобы проверить, работает ли звук
  2. Используйте fakesink или filesink, чтобы увидеть, есть ли у нас буферы
  3. Попробуйте найти проблему с конвейером с помощью GST_DEBUG, например, проверьте заглавные буквы с помощью GST_DEBUG=GST_CAPS:4 или используйте *:2, чтобы получить все ошибки / предупреждения
  4. Используйте wireshark, чтобы увидеть, отправляются ли пакеты

У меня работают эти конвейеры:

с RTP:

gst-launch-0.10 -v udpsrc port=5000 ! "application/x-rtp,media=(string)audio, clock-rate=(int)44100, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96" ! rtpL16depay ! audioconvert ! alsasink sync=false

gst-launch-0.10 audiotestsrc ! audioconvert ! audio/x-raw-int,channels=1,depth=16,width=16,rate=44100 ! rtpL16pay  ! udpsink host=localhost port=5000

с TCP: :

gst-launch-0.10 tcpserversrc host=localhost port=3000 ! audio/x-raw-int, endianness="(int)1234", signed="(boolean)true", width="(int)16", depth="(int)16", rate="(int)44100", channels="(int)1" ! alsasink

gst-launch-0.10 audiotestsrc ! tcpclientsink host=localhost port=3000
1 голос
/ 27 апреля 2010

Можете ли вы опубликовать некоторые из конвейеров gst-launch, которые вы пробовали? Это может помочь понять, почему у вас возникли проблемы. В целом RTP / RTSP должен работать довольно легко.

Edit: Пара вещей, о которых я могу думать, это 1. измените host = localhost на host = где - фактический IP-адрес другого компьютера с Linux 2. добавьте caps = "application / x-rtp, media = (string) audio к элементу udpsrc в приемнике.

0 голосов
/ 15 июля 2012

Мое решение очень похоже на tilljoel, но я использую микрофон (что вам нужно) в качестве источника - отсюда и некоторые изменения в конвейере gstreamer.

Декодирование аудио с микрофона с использованием TCP:

gst-launch-0.10 tcpserversrc host=localhost port=3000 !  audio/x-raw-int, endianness="(int)1234", signed="(boolean)true", width="(int)16", depth="(int)16", rate="(int)22000", channels="(int)1" ! alsasink

Кодирование аудио с микрофона с использованием TCP:

gst-launch-0.10 pulsesrc ! audio/x-raw-int,rate=22000,channels=1,width=16 ! tcpclientsink host=localhost port=3000

Декодирование аудио с микрофона с использованием RTP:

gst-launch-0.10 -v udpsrc port=5000 ! "application/x-rtp,media=(string)audio, clock-rate=(int)22000, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96" ! rtpL16depay ! audioconvert ! alsasink sync=false

Кодирование аудио с микрофона с использованием RTP:

gst-launch-0.10 pulsesrc ! audioconvert ! audio/x-raw-int,channels=1,depth=16,width=16,rate=22000 ! rtpL16pay  ! udpsink host=localhost port=5000
...