В статье пойдет речь о том как вывести аудио, проигрываемое на raspberry pi на несколько источников (проигрывателей) одновременно. В частности, аудио будет параллельно транслироваться по hdmi, на audio jack, bluetooth устройство (устройства).

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

Устанавливаем пакеты


pip3 install pygame==2.1.2
sudo apt-get install python3-sdl2
sudo apt install paprefs
sudo apt install pavucontrol

Перезагружаемся.

Настраиваем


Заходим в «Pulseaudio Preferences» —

и ставим галочку, перейдя на вкладку «Simultaneous Output» —



Теперь открываем «PulseAudio Volume control» —

и убеждаемся, что там появилось новое устройство вывода среди output devices —

При этом абсолютно неважно, Что у вас выбрано в качестве output устройства в данный момент —

По желанию, можно подключить несколько bluetooth устройств к raspberry —



Небольшой код


Теперь напишем код, который и будет выводить аудио на несколько устройств одновременно.

import pygame._sdl2 as sdl2
from pygame import mixer
from time import sleep

mixer.init()# Initialize the mixer, this will allow the next command to work
print(sdl2.audio.get_audio_device_names(False)) # Returns playback devices, Boolean value determines whether they are Input or Output devices.
def output_devices(): #возвращает device, который включает все play devices
    for i in sdl2.audio.get_audio_device_names(False):
        if i.startswith ('Simultaneous'):
            return i
        else:
            continue
a=output_devices()
mixer.quit() 

#mixer.init(devicename = 'Simultaneous output to Встроенное аудио Digital Stereo, Встроенное аудио Analog Stereo, JBL GO') # Initialize it with the correct device
mixer.init(devicename = a)
mixer.music.load("english.wav") # Load the mp3
mixer.music.play() # Play it

while mixer.music.get_busy():  # wait for music to finish playing
    sleep(1)

После запуска звук должен политься из всех устройств одновременно.

Суть программы в том, что она перебирает все устройства вывода на raspberry, находит то из них, которое начинается со слова «Simultaneous» и выводит на него звук.

Полностью наименование этого устройства выгладят примерно так: «Simultaneous output to Встроенное аудио Digital Stereo, Встроенное аудио Analog Stereo, JBL GO».

Воспроизведение аудио на несколько источников возможно также задать не только через программу, но и в конфигурации аудио самой raspberry pi, нажав на зеленый кружок:


Код программы — здесь
Аудио для теста — здесь

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


  1. rexen
    18.05.2022 11:54

    Вопрос прикладной
    Хотелось бы пару реальных практических случаев, когда это понадобилось. Я могу вспомнить мультирум, но там это решается по-другому. Например, аналоговый выход можно «размножить» как угодно чисто схемотехническими методами.


    1. hoary
      18.05.2022 12:32

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


    1. NiPh
      18.05.2022 13:26

      Мне бы например хотелось такое без бубна на ноутбуке или домашнем кинотеатре иметь, чтобы смотреть кино с двух и более пар наушников которые под рукой найдутся, не мешая соседям спать.


      1. zoldaten Автор
        18.05.2022 13:55

        Для домашнего кинотеатра raspberry будет многовато, чтобы просто звук раздавать. Есть вот такая штука для чисто прагматичных задач - VAORLO Multipoint Bluetooth 5.0 Audio Transmitter


        1. safari2012
          18.05.2022 16:09

          Почему нет? Сама по себе малина может быть медиацентром, KODI/OpenElec.


      1. rexen
        18.05.2022 21:22

        Прикрутить FM-трансмиттер (передатчик)? Вон в пробке некоторые массово слушают по радио чо там "крутят" "соседи по потоку" :)

        Но, да, в принципе, мультиподключение по блютусу - вполне себе сценарий. А если ещё параллельная раздача звука по HDMI/Jack на колонки будет отключаться при активации блютус-наушников - вообще сказка.