Наверх

Сетевой аудиоплеер на основе Raspberry Pi

29 августа 2017 г.

Ноутбук - мой самый основной инструмент дома. А так как этот тип компьютера подразумевает мобильность, то каждый подключенный к нему провод, убивает напрочь эту мобильность. Поэтому со временем я обзавелся беспроводной мышью, потом купил Raspberry Pi, сделал на его основе принт-сервер, и вот из всех проводов остались только кабель питания и аудио-кабель, идущий к усилителю. Если питание ноутбука на сегодняшний день беспроводным никак не сделать, то вот воспроизведение аудио возможно сделать дистанционным. В данной заметке я расскажу, каким образом я это организовал.

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

Поиск решения

Как я уже говорил, у меня есть одноплатный компьютер Raspberry Pi 2B. Покупал я его, чтобы поиграться и понять, что это вообще такое. Первым делом сделал из него принт-сервер, благо инструкций в интернете достаточно. А так как принтер и усилитель у меня стоят рядом, то было бы логично использовать Raspberry для воспроизведения звука. Поначалу я искал способ заставить его обнаруживаться моим ноутбуком как внешняя сетевая аудиокарта, чтобы можно было бы все звуки воспроизводить через нее. Но такого я не нашел, зато нашел такую вещь как MPD (music player daemon). Это музыкальный проигрыватель, имеющий клиент-серверную архитектуру. На стороне Raspberry устанавливается сервер, а на стороне ноутбука клиент - проигрыватель, который звук отправляет на сервер. Вариант рабочий, но ни один плеер мне не нравился.

Смартфон, которым я пользуюсь - iPhone (а также у брата, который тоже пользуется моей стерео-системой). А у Apple есть готовая технология AirPlay, обеспечивающая беспроводную потоковую передача медиаданных, будь то аудио, видео или изображения. Почему бы не попробовать задействовать ее? Для этого нужно решить две проблемы - во-первых, заставить Raspberry работать как AirPlay приемник, во-вторых, найти на Windows плеер, поддерживающий AirPlay. Apple устройства поддерживают эту технологию "из коробки".

Решением первой проблемы является установка приложения Shairport AirPlay. Ниже я привел инструкцию по его установке и по настройке Raspberry Pi в качестве AirPlay приемника.

Вторая проблема решилась очень просто - я нашел и купил для своего плеера foobar2000 плагин Remote Speakers Output (не реклама). Он платный, но стоит не очень дорого. Теперь можно выбрать в качестве приемника (который я назвал Amplifier) наш Raspberry, и на него будет транслироваться копия аудиосигнала. Но основное устройство вывода звука можно совсем отключить, если вы планируете использовать только получившийся сетевой плеер.

Но нужно отметить, что у AirPlay есть ограничение - поддерживается только CD-качество 44,1 кГц 16 бит, поэтому приходиться с этим мириться. С другой стороны, почти все мои аудиозаписи имеют именно такой формат.

Настройка Raspberry Pi как AirPlay-приемника

Монитора и клавиатуры для Raspberry у меня нет, поэтому все действия выполняются через консоль на удаленном ПК. ОС - Raspbian.

  1. Откроем аудио микшер, чтобы убедиться, что звук не приглушен и его уровень составляет 0 дБ. Для этого вводится команда:
  2. alsamixer

  3. Далее проверим звук, запустив синус для воспроизведения:
  4. speaker-test -t sine

  5. Откроем файл конфигурации ALSA командой
  6. sudo nano /usr/share/alsa/alsa.conf

    и заменим строку

    pcm.front cards.pcm.front

    на

    pcm.front cards.pcm.default

    Сохраняем изменения (Ctrl+O) и выходим из редактора (Ctrl+X).

  7. Далее установим приложение Shairport AirPlay, которое будет эмулировать конечное устройство AirPlay. Но перед этим необходимо установить несколько дополнительных модулей командами:
  8. sudo apt-get install libao-dev libssl-dev git avahi-utils libwww-perl sudo apt-get install libcrypt-openssl-rsa-perl libio-socket-inet6-perl libmodule-build-perl

  9. После этого создадим каталоги, куда будем устанавливать Shairport AirPlay.
  10. mkdir projects cd projects mkdir airplay-audio-project cd airplay-audio-project

  11. При необходимости установим модули для поддержки устройств на iOS6 командами:
  12. git clone https://github.com/njh/perl-net-sdp.git cd perl-net-sdp perl Build.PL ./Build ./Build test sudo ./Build install cd ..

  13. Скопируем Shairport AirPlay из репозитория и запустим следующими командами:
  14. git clone https://github.com/abrasive/shairport.git cd shairport make

  15. Теперь можно проверить работу приложения. Для этого введите:

    ./shairport -a RaspberryPi

    Если все сделано верно, то на устройстве Apple появится приемник AirPlay с именем RaspberryPi.

  16. Теперь установим Shairport AirPlay командой:
  17. sudo make install

    Следующие три команды дают возможность делать это автоматически при запуске Raspberry:

    sudo cp scripts/debian/init.d/shairport /etc/init.d/shairport sudo chmod +x /etc/init.d/shairport sudo update-rc.d shairport defaults

  18. Теперь сделаем кое-какие настройки. Для этого откроем файл настроек Shairport:
  19. sudo nano /etc/init.d/shairport

    Для автостарта приложения нужно строчку

    DAEMON=/usr/bin/shairport

    заменить на

    DAEMON=/usr/local/bin/shairport

    А также строки

    USER=shairport GROUP=nogroup

    на

    USER=pi GROUP=pi

    Для смены имени устройства (например на Amplifier) замените строку

    AP_NAME=$(hostname)

    на

    AP_NAME=Amplifier

  20. Для завершения настройки перезагрузите устройство командой
  21. sudo reboot now

Смена звуковой карты по-умолчанию

Для вывода звука с Raspberry Pi я использую не ее встроенную звуковую карту, а внешний ЦАП на основе PCM2707. А встроенный аналоговый звук я совсем отключил.

  1. Откройте в редакторе файл /boot/config.txt
  2. sudo nano /boot/config.txt

    и закомментируйте (символом #) строку dtparam=audio=on, отключив тем самым аналоговый аудиовыход.

  3. Далее установите USB звуковую карту устройством воспроизведения по умолчанию. Для этого откройте в редакторе файл /lib/modprobe.d/aliases.conf
  4. sudo nano /lib/modprobe.d/aliases.conf

    и закомментируйте строку options snd-usb-audio index=-2.

  5. Перезагрузите Raspberry Pi.


26 декабря 2017 г.

Нашел отличную программу для моих целей - Airfoil от Rogue Amoeba. Позволяет из-под Windows отправить как весь системный звук, так и звук отдельного приложения на устройство с AirPlay. Правда стоит немного денег.