Архитектура асинхронного преобразования в GStreamer - PullRequest
0 голосов
/ 21 октября 2019

Мне трудно создать фильтр GStreamer, который бы непрерывно направлял входящие буферы на сетевой сервер и выводил ответ сервера в потоковом режиме. Подумайте о соединении через веб-сокет, которое я устанавливаю один раз, а затем одновременно читайте и пишите.

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

Я пробовал / рассматривал несколько вариантов:

  • Блокировка для чтения / записиработа над цепной функцией мойки. Это может привести к тупикам.

  • Создание собственных потоков для чтения и записи. Трудно управлять жизненным циклом потока.

  • Имеет два приемника, один для обычных входных данных (для отправки в веб-сокет), а другой - просто «часы» для запуска чтения веб-сокетов в другомнить и подталкивание к выводу. Ужасно, и мне все еще нужно где-то управлять инициализацией / финализацией соединения.

  • Наличие этой функциональности вне элемента, возможно, в конвейере. Однако я предпочел бы иметь автономный элемент.

Ни один из этих подходов не кажется естественным, тем более что я пытался создать его с помощью Rust bindings и должен был бороться с компилятором на каждом этапе пути (например, почему self заимствовано в цепочечных функциях ?! Но это совсем другая история)

  1. Я делаю что-то неестественное и борюсь сфундаментальный дизайн GStreamer? Это точно так.
  2. Есть какие-нибудь указатели на существующие элементы GStreamer, которые делают что-то подобное? Я посмотрел, но не смог найти ни одного. Самым близким был фестиваль , но после чтения источника он, кажется, выполняет пакетные запросы, а не потоковую передачу.
  3. Какое подходящее место для управления процессом асинхронизации, например, создать и разорвать сетевое соединение?
  4. Нужно ли использовать режим планирования ? Возможно, есть какая-то подходящая комбинация режимов push / pull, функций chain / getrange / loop?
  5. Я ошибаюсь, глядя на функции цепочки? Должен ли я запустить свой собственный GstTask или два для чтения и записи?
...