В статье я расскажу об особенностях стриминга музыки в разных современных протоколах. А также о том, как с помощью Home Assistant отправить Яндекс Музыку с колонок Яндекса на внешнюю акустику и как передать свою музыку на колонки Яндекса.

Протоколы стриминга мультимедиа

На сегодняшний день существует несколько наиболее популярных технологий стриминга мультимедиа.

AirPlay от Apple

В качестве плееров используются ТВ-приставки и колонки Apple, брендовая аудиотехника и телевизоры известных сторонних производителей, а также многочисленные дешёвые no-name медиаресиверы.

В качестве клиентских устройств чаще всего используются iPhone, iPad и MacBook. Почему эту технологию не встраивают в Android-приложения, лично мне непонятно — никаких технологических ограничений для этого нет. Возможно, существуют какие-то юридические барьеры.

Cast от Google

В качестве плееров используются ТВ-приставки Chromecast и другие устройства на операционной системе Android TV. Важно, чтобы это был именно лицензионный Android TV, а не обычный Android, растянутый до разрешения FullHD или 4K.

Google серьёзно подошли к защите от копирования. На сегодняшний день мне не известно ни одного рабочего проекта, где удалось бы реализовать сервер (приёмник) для этого протокола.

В качестве клиентских устройств используются смартфоны и планшеты на Android и iOS, а также браузер Chrome во всех популярных операционных системах. В отличии от AirPlay, технологию активно встраивают в устройства Apple.

DLNA

Открытый (и уже довольно устаревший) набор протоколов для обмена медиаконтентом в локальных сетях. Поддерживается огромным количеством разнообразных устройств, однако практическая реализация этого стандарта часто оставляет желать лучшего.

Способы передачи данных в стриминг-протоколах

Все рассмотренные протоколы поддерживают два принципиально различных метода передачи медиаконтента:

  1. Прямая ссылка на контент
    Устройству передаётся HTTP-ссылка на медиафайл или поток через API. Плеер самостоятельно загружает и воспроизводит контент, используя встроенные декодирующие возможности.

  2. Трансляция с устройства
    Медиафайл или поток предварительно декодируется на клиентском устройстве (смартфоне, компьютере или сервере), после чего передаётся на плеер в режиме реального времени в уже обработанном виде.

Особенности стриминга ссылок

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

  • разрабатывать собственный медиаплеер с поддержкой различных форматов;

  • реализовывать сложные протоколы передачи данных в реальном времени.

Несмотря на кажущуюся простоту, этот подход имеет ряд технических особенностей:

  1. Некоторые плееры (чаще всего DLNA) не поддерживают SSL (HTTPS) и работают только с HTTP-ссылками

  2. Некоторые плееры (чаще всего DLNA) не поддерживают DNS и работают только с IP-адресами

  3. Некоторые плееры требуют явного указания расширения файла (.mp3.m3u8 и тп) в URL

  4. Некоторым плеерам важен правильный Content-Type в HTTP-заголовке ответа

  5. Некоторым плеерам (чаще всего DLNA) важна поддержка HEAD-запроса

  6. Некоторым плеерам (например, Google Cast) важна поддержка CORS для HLS формата медиапотока

Чтобы обойти все перечисленные ограничения, я разработал прокси-решение на платформе умного дома Home Assistant. В результате получились ссылки следующего формата:

http://{HOME_ASSISTANT_IP}:8123/api/yandex_station/{JWT_TOKEN}.{EXTENSION}

Разработанный прокси-сервер на базе Home Assistant эффективно решает все указанные ограничения:

  • Локальные запросы обрабатываются по HTTP, внешнее подключение к Home Assistant может работать по HTTPS

  • Используется прямой IP-адрес сервера вместо доменных имен

  • Реальная ссылка на медиа-файл запакована в JWT-токене:

    • Токен состоит из URL-safe символов, что обеспечивает совместимость со всеми плеерами

    • Токен позволяет не хранить в памяти прокси список реальных ссылок и не следить за их очисткой

    • Токен выполняет роль авторизации, чтоб злоумышленник не смог пользоваться нашим прокси сервером

    • Токен позволяет реализовать механизм «устаревания» ссылок, он нам позже понадобится

  • Расширение файла явно указывается в конце URL

Стриминг с колонок Яндекса на другие устройства

Использовать Алису для управления музыкой довольно удобно. Можно запустить голосом любую песню, альбом или «Мою волну». Переключить трек или изменить громкость. При желании воспроизведением можно управлять из мобильного приложения Яндекс Музыки.

Если вы активный пользователь Яндекс.Музыки, то у вас вполне может возникнуть закономерное желание слушать её на своей домашней «взрослой» акустике. Как вариант, можно купить колонку Яндекса с AUX-выходом. Но подключение колонок проводом не всегда удобно.

Я уже более пяти лет развиваю интеграцию колонок Яндекса в открытую платформу умного дома Home Assistant.

По результатам 2024 года платформа Home Assistant возглавила рейтинг самых востребованных проектов с открытым исходным кодом на платформе GitHub. Неудивительно, что в нём поддерживаются десятки различных технологий передачи медиаконтента: Apple TVDLNAGoogle CastKodiMPDSamsung TVSonosYamaha MusicCast и многие другие.

Поддержка функции стриминга на внешнюю акустику появилась в интеграции довольно давно - в ноябре 2021 года. И работала по следующему алгоритму:

  1. Пользователь выбирает медиаплеер, на который будет выполняться стриминг музыки

  2. Интеграция получает прямую MP3-ссылку на текущую песню, используя локальный протокол управления колонками Яндекса

  3. Интеграция отправляет эту ссылку на медиаплеер, используя прокси, описанный в прошлом разделе и стандартные API Home Assistant

  4. Звук на колонке Яндекса отключается, потому что невозможно добиться идеальной синхронизации воспроизведения (мультирум) на устройствах разных производителей

Если при этом пользователь обращается к Алисе, звук на колонке временно включается, а после завершения взаимодействия снова отключается.

У данного подхода был один неприятный момент — качество воспроизводимой музыки зависело от качества самой колонки. И для Яндекс Мини колонок стриминг на «взрослую» акустику терял весь смысл в получении качественного звука.

Поэтому в следующих обновлениях пришлось реализовать поиск и получение прямой MP3-ссылки на текущую композицию в максимальном качестве 320 кбит/с. В решении этой задачи неоценимую помощь оказал проект Yandex Music API от @MarshalX.

В конце 2024 года в интеграцию была добавлена поддержка стриминга в формате FLAC.

В июне 2025 года была реализована поддержка стриминга радиостанций. Основная сложность заключалась в том, что функционал радио на колонках работает не через сервис Яндекс Музыки, а использует HLS-формат. Для реализации этой функции потребовалось добавить поддержку HLS и CORS-заголовков в упомянутый ранее прокси-сервер.

Стриминг своей музыки на колонки Яндекса

Недавно было обнаружено API для отправки собственных медиа-ссылок на колонки Яндекса через локальный протокол управления колонками Яндекса.

API оказалось весьма привередливым к формату ссылок, поэтому в этом случае нам снова пригодился механизм проксирования, описанный ранее.

Дополнительным неудобством было то, что колонка воспроизводила отправленную ссылку бесконечно. Здесь пригодился механизм «устаревания» ссылок поверх JWT‑токена. Ссылки, отправленные на колонки Яндекса, действуют всего несколько секунд, поэтому при повторном запросе уже не работают — это решает упомянутую проблему.

Теперь с помощью расширения Music Assistant вы можете легко транслировать свою локальную музыку на колонки Яндекса по беспроводному соединению. Протестирована работа с локальными файлами, Plex Media Server и Spotify.

Эпилог

Исходные коды компонента YandexStation вы можете изучить на GitHub.

А следить за развитием всех моих проектов — в Telegram‑канале.

Комментарии (0)