Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

вторник, 15 января 2019 г.

Java, Spring, Kurento и медиасервисы. Часть 2-я / Программирование на Java

В предыдущей статье я описывал мой эксперимент с приложением «HelloWorld» из Kurento-туториала. В этой статье я продолжу обзор Web приложений на Java Spring и Kurento Media Server-a. 

Следующее приложение из туториала называется WebRTC Magic Mirror. Из названия следует, что зеркало отражает немного приукрашенную действительность. В этом приложении в дополнение к предыдущему применяется фильтр компьютерного зрения «FaceOverlay filter». При обнаружении в камере лица человека Kurento Media Server «надевает» на голову кепку Супер Марио. Если в обьективе несколько лиц, каждому надевается кепка.

Запускаем Kurento Media Server

sudo service kurento-media-server start

Если вы уже склонировали Kurento Java tutorial, не выполняйте следующую команду:

git clone https://github.com/Kurento/kurento-tutorial-java.git

Переходим в директорию с проектом

cd kurento-tutorial-java/kurento-magic-mirror

Компилируем проект командой Maven 

mvn compile exec:java

Или, как в моем случае, запустим из Идеи.

В браузере Firefox заходим по адресу https:// localhost:8443/

В открывшемся окне нажимаем на кнопку «Start», должны увидеть картинку:

imageИз этого опыта делаем вывод: морда моего кота совсем не похожа на человеческую, поэтому кепка Супер Марио ему не положена.

Разберемся, как работает этот пример.

Структура приложения повторяет предыдущее приложение HelloWorld. Так же в приложении взаимодействуют три программных блока: на стороне браузера код Java Script, на стороне сервера Spring-Boot Web приложение, которое управляет Kurento Media Server-ом. Эти программные блоки обмениваются друг с другом сообщениями на базе Json протокола.

image
На схеме показано, что в KMS программный блок WebRtcEndpoint теперь не заворачивает передачу мультимедийного сигнала на прием, а предварительно пропускает его через FaceOverlayFilter, который определяет наличие лица на картинке.

Обмен сигналами между программными блоками примерно такой же, как в приложении HelloWorld.

image
Основные действия в приложении выполняются при нажатии на кнопку «Start». Создается MediaPipeline, через которую будет передаваться медиа траффик, создаются медиа элементы WebRtcEndpoint и FaceOverlayFilter, создается соединение между ними. 

Здесь упрощенная последовательность операторов, которая формирует цепочку программных блоков для данного приложения.

MediaPipeline pipeline = kurento.createMediaPipeline();
WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build();
FaceOverlayFilter faceOverlayFilter = new FaceOverlayFilter.Builder(pipeline).build();
webRtcEndpoint.connect(faceOverlayFilter);
faceOverlayFilter.connect(webRtcEndpoint);

Рассмотрим следующее приложение из Kurento туториала под названием RTP Receiver.

Если не запущен, запускаем Kurento Media Server

sudo service kurento-media-server start

Если вы уже склонировали Kurento Java tutorial, не выполняйте следующую команду:

git clone https://github.com/Kurento/kurento-tutorial-java.git

Переходим в директорию с проектом

cd kurento-tutorial-java/kurento-rtp-receiver

Компилируем проект командой Maven 

mvn compile exec:java

или, как в моем случае, запустим из Идеи.

В браузере Firefox заходим по адресу https:// localhost:8443/

в открывшемся окне нажимаем на кнопку «Start»

image
В окне KMS connection info появляются данные для настройки команды для Gstreamer-а: аудио, видео порт, IP-адрес. Эти данные, а так же путь к файлу нужно указать в команде.

PEER_A={KMS_AUDIO_PORT} PEER_V={KMS_VIDEO_PORT} PEER_IP={KMS_PUBLIC_IP} \
SELF_PATH="{PATH_TO_VIDEO_FILE}" \
SELF_A=5006 SELF_ASSRC=445566 \
SELF_V=5004 SELF_VSSRC=112233 \
bash -c 'gst-launch-1.0 -e \
        rtpbin name=r sdes="application/x-rtp-source-sdes,cname=(string)\"user\@example.com\"" \
        filesrc location="$SELF_PATH" ! decodebin name=d \
        d. ! queue ! audioconvert ! opusenc \
                ! rtpopuspay ! "application/x-rtp,payload=(int)96,clock-rate=(int)48000,ssrc=(uint)$SELF_ASSRC" \
                ! r.send_rtp_sink_0 \
        d. ! queue ! videoconvert ! x264enc tune=zerolatency \
                ! rtph264pay ! "application/x-rtp,payload=(int)103,clock-rate=(int)90000,ssrc=(uint)$SELF_VSSRC" \
                ! r.send_rtp_sink_1 \
        r.send_rtp_src_0 ! udpsink host=$PEER_IP port=$PEER_A bind-port=$SELF_A \
        r.send_rtcp_src_0 ! udpsink host=$PEER_IP port=$((PEER_A+1)) bind-port=$((SELF_A+1)) sync=false async=false \
        udpsrc port=$((SELF_A+1)) ! r.recv_rtcp_sink_0 \
        r.send_rtp_src_1 ! udpsink host=$PEER_IP port=$PEER_V bind-port=$SELF_V \
        r.send_rtcp_src_1 ! udpsink host=$PEER_IP port=$((PEER_V+1)) bind-port=$((SELF_V+1)) sync=false async=false \
        udpsrc port=$((SELF_V+1)) ! tee name=t \
                t. ! queue ! r.recv_rtcp_sink_1 \
                t. ! queue ! fakesink dump=true async=false'

Кстати, проверьте установлен ли у вас Gstreamer

gst-launch-1.0 —gst-version

Подставили порты и прочее, в консоли запустили команду Gstreamer-a. 

Теперь, внимание играем в лотерею. Я не знаю будет или нет у вас проигрываться файл. У меня из моей небогатой коллекции клипов стали проигрываться файлы с расширением *.mpg 

image
Здесь проигрывается клип Натальи Могилевской. Клипы с другим расширением либо не проигрываются, либо проигрываются с искажением звука.

Из этого опыта делаем вывод: не все йогурты одинаково полезны.

Разберем работу этого приложения. Вначале создается Media Pipeline для передачи медиа траффика, а также RtpEndpoint и WebRtcEndpoint, последний выполняет работу приемника RTP пакетов и применяется для показа видео ролика.

Здесь упрощенная последовательность операторов этой части Java приложения:

final MediaPipeline pipeline = kurento.createMediaPipeline();
final RtpEndpoint rtpEp = makeRtpEndpoint(pipeline, useSrtp);
final WebRtcEndpoint webRtcEp =
    new WebRtcEndpoint.Builder(pipeline).build();
rtpEp.connect(webRtcEp);

На этом завершаю обзор этой части Kurento туториала. Удачного программирования!

Kurento
Kurento tutorial
Предыдущая статья


Смотри также популярное:

Зачем нужна Java. http://fetisovvs.blogspot.com/2014/07/java.html
Когда Java наконец помрёт, что с этим делать и что будет с JPoint. https://fetisovvs.blogspot.com/2018/11/java-jpoint-java.html
Разбор основных концепций параллелизма. http://fetisovvs.blogspot.com/2018/04/java.html
Первый контакт с «var» в Java 10. http://fetisovvs.blogspot.com/2018/01/var-java-10-java.html
JAVA 9. Что нового? http://fetisovvs.blogspot.com/2017/10/java-9-java.html
Руководство по Java 9 для тех, кому приходится работать с legacy-кодом. http://fetisovvs.blogspot.com/2018/08/java-9-legacy-java.html
Концепции объектно-ориентированного программирования — ООП в Java. http://fetisovvs.blogspot.com/2017/01/java-java.html
Анимации в Android по полочкам (Часть 1. Базовые анимации). http://fetisovvs.blogspot.com/2018/02/android-1-java.html
Двести пятьдесят русскоязычных обучающих видео докладов и лекций о Java. http://fetisovvs.blogspot.com/2015/12/java-5-java-java.html
Абстрактные классы и методы. http://fetisovvs.blogspot.com/2017/02/java.html
Полное руководство по Java Reflection API. Рефлексия на примерах. http://fetisovvs.blogspot.com/2017/02/java-reflection-api-java.html
Микросервисы для Java программистов. Практическое введение во фреймворки и контейнеры. http://fetisovvs.blogspot.com/2017/10/java-java.html
Микросервисы для Java программистов. Практическое введение во фреймворки и контейнеры. (Часть 3). http://fetisovvs.blogspot.com/2017/10/java-3-java.html
ТОП-3 способа конвертировать массив в ArrayList. Пример на Java. http://fetisovvs.blogspot.com/2016/09/3-arraylist-java-java.html
Ввод–вывод в Java. http://fetisovvs.blogspot.com/2016/05/java-java_28.html
Java Challengers #2: Сравнение строк. https://fetisovvs.blogspot.com/2018/11/java-challengers-2-java.html
Enum-Всемогущий. http://fetisovvs.blogspot.com/2017/02/enum-java.html
Массивы в Java. Создание и обработка. http://fetisovvs.blogspot.com/2017/10/java-java_18.html
Arrays, Collections: Алгоритмический минимум. http://fetisovvs.blogspot.com/2017/12/arrays-collections.html
Популярные методы для работы с Java массивами. http://fetisovvs.blogspot.com/2016/09/java-java_29.html
Пример использования метода replace в Java. Как заменить символ в строке? http://fetisovvs.blogspot.com/2017/01/replace-java-java.html
Класс Scanner в Java — описание и пример использования. http://fetisovvs.blogspot.com/2017/01/scanner-java-java.html
Пример использования метода trim в Java: как удалить пробелы в начале и конце строки? http://fetisovvs.blogspot.com/2017/01/trim-java-java.html
Spark — Потрясающий веб-микрофреймворк для Java. http://fetisovvs.blogspot.com/2017/10/spark-java-java.html
Чтение и запись CSV файла с помощью SuperCSV. http://fetisovvs.blogspot.com/2017/01/csv-supercsv-java-java.html
Конструкция try/catch/finally (исключения). http://fetisovvs.blogspot.com/2017/01/trycatchfinally-java.html
1000+ часов видео по Java на русском. http://fetisovvs.blogspot.nl/2017/06/1000-java-java.html
Раздача халявы: нетормозящие треды в Java. Project Loom. http://fetisovvs.blogspot.com/2018/09/java-project-loom-java.html
Шпаргалка Java программиста 7.1 Типовые задачи: Оптимальный путь преобразования InputStream в строку. http://fetisovvs.blogspot.com/2016/04/java-71-inputstream-java.html
Шпаргалки Java программиста 10: Lombok. http://fetisovvs.blogspot.nl/2017/12/java-10-lombok-java.html
Шпаргалки Java программиста 9: Java SE — Шпаргалка для собеседований и повторений. http://fetisovvs.blogspot.com/2017/12/java-9-java-se-java.html
Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson,
LoganSquare, Jackson, JsonPath и другие). http://fetisovvs.blogspot.com/2016/04/java-8-json-gson-fastjson-logansquare.html
Java 8 и паттерн Стратегия. http://fetisovvs.blogspot.com/2018/03/java-8-java.html
Java EE Concurency API. http://fetisovvs.blogspot.com/2018/08/java-ee-concurency-api-java.html
Реализация ООП-наследования в классах, работающих с SQL и MS Entity Framework. http://fetisovvs.blogspot.com/2017/02/sql-ms-entity-framework.html
Как установить соединение с СУБД MySQL в IntelliJ IDEA в редакции Community. http://fetisovvs.blogspot.com/2016/04/mysql-intellij-idea-community-java.html
TDD приложений на Spring Boot: работа с базой данных. https://fetisovvs.blogspot.com/2018/12/tdd-spring-boot-java.html
Руководство: Thymeleaf + Spring. Часть 1. https://fetisovvs.blogspot.com/2019/01/thymeleaf-spring-1-java.html
Введение в Spring Boot: создание простого REST API на Java. https://fetisovvs.blogspot.com/2019/01/spring-boot-rest-api-java-java.html
Максимально простой в поддержке способ интеграции java-клиента с java-сервером. http://fetisovvs.blogspot.com/2018/09/java-java-java.html
AOP vs Функции. https://fetisovvs.blogspot.com/2019/01/aop-vs-java.html
Как с помощью maven работать с библиотеками, которых в maven нет. http://fetisovvs.blogspot.com/2017/03/maven-maven-java.html
Проекты по созданию компиляторов из Java в JavaScript и исполняемые файлы. http://fetisovvs.blogspot.com/2018/01/java-javascript-java.html
Реактивное программирование с JAX-RS. http://fetisovvs.blogspot.com/2018/09/jax-rs-java.html
Компактные строки в Java 9. https://fetisovvs.blogspot.com/2018/10/java-9-java.html
Динамический прокси Java: что это и как им пользоваться? https://fetisovvs.blogspot.com/2018/12/java-java.html
Абстрактный CRUD от репозитория до контроллера: что ещё можно сделать при помощи Spring + Generics. http://fetisovvs.blogspot.com/2018/09/crud-spring-generics-java.html
Диагностика утечек памяти в Java. http://fetisovvs.blogspot.com/2017/03/java-java_18.html
Java, Spring, Kurento и медиасервисы. https://fetisovvs.blogspot.com/2019/01/java-spring-kurento-java.html
Spring AOP и JavaConfig в плагинах для Atlassian Jira. http://fetisovvs.blogspot.com/2018/04/spring-aop-javaconfig-atlassian-jira.html
Маппинг запросов на Netty. https://fetisovvs.blogspot.com/2019/01/netty-java.html
Блеск и нищета Java для настольных систем. http://fetisovvs.blogspot.com/2018/04/java-haulmont-java.html
Разбор задачек от Одноклассников на JPoint 2018. http://fetisovvs.blogspot.com/2018/04/jpoint-2018-java.html
Программируем… выход из лабиринта. http://fetisovvs.blogspot.com/2015/10/java.html
Основы работы с IntelliJ IDEA. Интерфейс программы. http://fetisovvs.blogspot.com/2016/09/intellij-idea-java.html
Ускоряем время сборки и доставки java web приложения. http://fetisovvs.blogspot.com/2018/03/java-web-java.html
Открытый урок Java Enterprise «CDI in action». http://fetisovvs.blogspot.com/2018/09/java-enterprise-cdi-in-action-java.html
«Мы все стремимся к сложности, а потом с ней боремся»: интервью с Венкатом Субраманиамом. http://fetisovvs.blogspot.com/2018/09/java_16.html

Комментариев нет:

Отправить комментарий