Представим ситуацию: Олег — fullstack разработчик, работающий на Windows, и его новая задача — разработать клиент-серверное приложение для стриминга. Если быть точнее, то для захвата RTSP-камер. Можно, конечно, поднять сервер в облаке, но тогда к дебагу возможных проблем с клиентским кодом или настройкам сервера добавляется дебаг проблем с каналом, поэтому тестирование в локальной сети удобнее, в том числе, потому что это бесплатно. Или можно использовать Docker, но тогда добавляются другие сложности: из-за проблем с сетью, Docker на Windows непригоден к использованию, а обходной путь — запуск Docker в виртуальной машине — слишком усложняет работу.

Что делать в таком случае? Оптимальный вариант — использовать WSL, а вот как именно, мы расскажем (и покажем) на примере Web Call Server (WCS), который поможет нам при конвертации RTSP-потоков в WebRTC.

WCS устанавливается только на Linux-систему и в случае, если бы мы тестировали на Linux, схема выглядела бы так:

Catching_RTSP_streams_WebRTC_WCS_without_WSL2

Но в случае с Windows и WSL, схема будет выглядеть так:

Catching_RTSP_streams_WebRTC_WCS_in_WSL2

Как Windows начал с Linux дружить

How_does_WSL_work

В 2016 году мир познакомился с подсистемой Windows для Linux, или просто — WSL. Первая версия не особо понравилась пользователям, т.к. принцип работы заключался в эмуляции вызовов ядра Linux путем включения специального слоя, который в режиме реального времени транслировал системные вызовы Linux в системные вызовы Windows, что приводило к некоторым сложностям (например, не работало все, что было завязано на POSIX-таймеры реального времени). Вторая версия понравилась публике больше: она является полноценной виртуальной машиной с ядром Linux. Именно ее мы будем использовать далее.

Установка WSL

Для установки WSL 2 вы должны работать под управлением Windows 10 версии 2004 и выше (сборка 19041 и выше) или Windows 11.

Для начала проверим, какие дистрибутивы доступны. Открываем командную строку от имени администратора и выполняем следующую команду:

wsl --list --online

How_to_install_WSL

По умолчанию устанавливается Ubuntu 20.04 и если вас это устраивает, то можете просто ввести:

wsl --install

Мы же будем устанавливать Ubuntu 18.04:

wsl --install -d Ubuntu 18.04

Installing_Ubuntu-18.04

В случае успешной установки, необходимо задать имя пользователя и пароль, а также перезагрузить систему:

Ubuntu-18.04

После перезагрузки ПК, авторизируемся и обновляем установленные пакеты:

sudo apt-get update
sudo apt-get upgrade -y

Установка JDK

jdk-install-wsl2-windows-webrtc-serve

Любую из поддерживаемых версии можно установить из репозиториев или вручную, в зависимости от того, доступны пакеты в используемом дистрибутиве или нет. Например, в Ubuntu 18.04 JDK 8 доступна в репозиториях:

sudo apt-get install –y openjdk-8-jdk

jdk8-install-wsl2-windows-webrtc-server

А вот с JDK 14 придется повозиться и установить вручную. Скачиваем:

sudo rm -rf jdk*
curl -s https://download.java.net/java/GA/jdk14.0.1/664493ef4a6946b186ff29eb326336a2/7/GPL/openjdk-14.0.1_linux-x64_bin.tar.gz | tar -zx
[ ! -d jdk-14.0.1/bin ] && exit 1

Подготавливаем установочную папку:

sudo mkdir -p /usr/java
[ -d /usr/java/jdk-14.0.1 ] && sudo rm -rf /usr/java/jdk-14.0.1

Перемещаем файлы JDK в созданную папку:

sudo mv -f jdk-14.0.1 /usr/java
[ ! -d /usr/java/jdk-14.0.1/bin ] && exit 1

Создаем симлинк /usr/java/default:

sudo rm -f /usr/java/default
sudo ln -sf /usr/java/jdk-14.0.1 /usr/java/default

И все остальные:

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk-14.0.1/bin/java" 1
sudo update-alternatives --install "/usr/bin/jstack" "jstack" "/usr/java/jdk-14.0.1/bin/jstack" 1
sudo update-alternatives --install "/usr/bin/jcmd" "jcmd" "/usr/java/jdk-14.0.1/bin/jcmd" 1
sudo update-alternatives --install "/usr/bin/jmap" "jmap" "/usr/java/jdk-14.0.1/bin/jmap" 1
sudo update-alternatives --set "java" "/usr/java/jdk-14.0.1/bin/java"
sudo update-alternatives --set "jstack" "/usr/java/jdk-14.0.1/bin/jstack"
sudo update-alternatives --set "jcmd" "/usr/java/jdk-14.0.1/bin/jcmd"
sudo update-alternatives --set "jmap" "/usr/java/jdk-14.0.1/bin/jmap"

jdk14-install-wsl2-windows-webrtc-server

Проверяем:

java-version

Установка и запуск WCS

Install_WCS

Скачиваем WCS:

wget https://flashphoner.com/download-wcs5.2-server.tar.gz -O- | tar -zx

Download_WCS

И запускаем установку:

cd FlashphonerWebCallServer-*
sudo ./install.sh

Install_WCS

Далее — знакомимся с пользовательским соглашением. Необходимо нажимать Enter, пока не появится следующее сообщение:

Installing_WCS

Затем активируем лицензию:

cd /usr/local/FlashphonerWebCallServer/bin
sudo ./activation.sh

License_WCS

И ждем сообщение о завершении активации:

License_WCS_activated

Перед началом работы, необходимо перезапустить WCS:

cd /usr/local/FlashphonerWebCallServer/bin
sudo ./webcallserver set-permissions
sudo ./webcallserver start

Restart_WCS_server

Проверяем статус:

sudo ./webcallserver status

WCS_status

Тестирование

Переходим по ссылке https://localhost:8444/admin/ и вводим имя пользователя: demo, пароль: demo

Далее переходим на вкладку «Player»:

WCS_player

И пробуем опубликовать поток, вставив ссылку в поле “Stream” и нажав на кнопку “Start”. В результате получаем:

WCS_WebRTC_stream_WSL_RTSP

Готово! Вы великолепны. Теперь вам не нужно устанавливать вторую ОС и мучаться с виртуальными машинами, чтобы использовать функционал Linux под Windows.