Java, Spring, Kurento и медиасервисы



    Существует уже немало медиа сервисов, но люди продолжают их создавать. Решил и я заняться изобретением своего велосипеда.

    Натолкнувшись на проект Kurento, понял что это то, что мне надо. Данная статья является частично переводом Kurento Documentatin, частично это заметки о моих экспериментах с KurentoTutorial. Надеюсь что разработчикам, приступающим к изучению данного вопроса, этот материал поможет быстрее освоить тему создания медиа сервисов.

    Kurento c Esperanto переводится «поток». Разработан он в испанском университете Rey
    Juan Carlos Universidad
    . Kurento — это WebRTC Media Server и набор клиентского API, который упрощает создание приложений для Web и смартфонов. Это могут быть сервисы видеотелефонии, видеоконференцсвязи, мониторинг картинок от видеокамер с распознаванием движения, может проигрывать аудио-видео контент из файла или из сети, распознавать лицо или автомобильные номера, и много чего еще. Код Kurento является опенсорсным, распространяется на условиях лицензии Apache License Version 2.0 и доступен на Гитхабе. Как утверждают создатели Kurento, он похож на Lego, из его программных блоков можно сделать много полезных приложений. Могут применяться блоки прямо «из коробки», но можно разрабатывать так же свои плагины при желании.

    Примеры Web приложений приведены на Java, Node.js, JavaScript, хотя можно разрабатывать на любом языке, главное что бы обмен с Kurento Media Server-ом происходил на понятном ему Kurento-протоколе. Правда, для вышеупомянутых языков уже изобретены библиотеки, так что мороки будет меньше. А поскольку я изучаю Java и Spring, мои комментарии будут для этих примеров.

    Всякий уважающий себя туториал начинается с приложения HelloWorld. Не стал исключением и данный. Но прежде чем написать первое приложение, нужно установить KMS — Kurento Media Server, который написан на C++ и устанавливается только на Ubuntu или Linux Mint, причем версия (на момент написания статьи) должна быть между 14 и 18. Я сразу установил Linux Mint 19 версию и KMS не установился, пришлось откатывать на 18-ю.

    Ну вот установили систему, Intellij Idea, добавляем Kurento репозиторий и устанавливаем KMS:

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83

    sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF
    # Kurento Media Server - Release packages
    deb [arch=amd64] http://ubuntu.openvidu.io/6.7.1 $DISTRO kms6
    EOF

    sudo apt-get update

    sudo apt-get install kurento-media-server

    Стартуем KMS командой:

    sudo service kurento-media-server start

    Клонируем весь туториал для Java:

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

    Переходим в нужную директорию

    cd kurento-tutorial-java/kurento-hello-world

    Запускаем приложение под Maven или, как в моем случае, через Идею. После запуска Web приложения заходим через браузер Firefox по адресу localhost:8443/ видим страничку, где после нажатия на кнопку «Start» получаем что-нибудь похожее на это

    image

    В левом видео-элементе отображается картинка от Web камеры, а в правом та же картинка, но изображение пропущено через KMS петлей (loop-back).

    На основании данного опыта делаем вывод: HelloWorld получается запустить почти всегда.
    Теперь разберемся как это работает. На данном рисунке показана схема подключения частей нашего опыта.

    image

    Схематически выглядит так, как я описал. Логически наш опыт состоит из трех главных частей: размещенный в браузере JavaScript Client, только что скомпилированный Application Server и установленный в самом начале Kurento Media Server. Взаимодействие этих частей показано на рисунке ниже.

    image

    image

    JavaScript Client отправляет Application Server — у текстовое сообщение «Start». Application Server выполняет три основные действия в этом приложении:

    final MediaPipeline pipeline = kurento.createMediaPipeline();
    user.setMediaPipeline(pipeline);
    final WebRtcEndpoint webRtcEp =
        new WebRtcEndpoint.Builder(pipeline).build();
    user.setWebRtcEndpoint(webRtcEp);
    webRtcEp.connect(webRtcEp);

    Создает MediaPipeline, по которой будет передаваться медиа-трафик, создает WebRtcEndpoint-объект, обрабатывающий медиа-трафик и заворачивает передачу этого блока себе на прием.

    На этом краткое ознакомление с приложением HelloWorld, использующим Kurento, завершаю. Желаю успешного создания медиа-сервисов.
    Следующая статья

    Комментарии 6

      0
      >отображается картинка от Web камеры
      А разве она не должна быть заклеена синей изолентой? :)
        0
        Камера одна, если ее заклеить, то и на левой и на правой картинке будет только синяя изолента.
        0
        Увы, на практике стабильность куренты большая проблема. После 2 лет работы, мы с колегами так и не смогли понять, почему процесс может умереть на ровном месте. Постоянно надо писать костыли и велосипеды, что бы у тебя была всегда актуальная информация про твои поднятые сервера куренты и отвечают ли они. Так же иногда курента может потерять твой стрим. Пришлось фиксить, тем что на фронт-части как себя стрим чувствует и в случае чего, пересоздавать стрим. Так же проблемы, при создании стрима между 10 людьми. Да, зависимость нагрузки квадратичная, но нагрузка прыгала на 100 в определенный момент, без видимых причин и два одинаковых сервера могли держать разную нагрузку. Пришлось распаралелить нагрузку в кластере. OpenVidu не пробывал, к сожалению, но на данный момент, куренту могу советовать, просто для общего развития, а не как медиа-сервис для энтерпрайза.
          0

          а что можете советовать в альтернативу, не имеющего озвученных проблем?

            0
            Доверяю проведенным экспериментам. Хотя в презентации руководитель проекта утверждает, что там все красиво. Что на основе Kurento у них есть новый проект ElasticRTC, который сможет взаимодействовать с облачными сервисами.
            Правда, в документации написано, что возможна платная техподдержка, это наводит на мысль, что они знают, где у них зарыты собаки. А пока изучаю Kurento в учебных целях.
              0
              Полностью с вами согласен, janus будет по стабильнее и поддерживает последние фишки webrtc.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое