Фон
Удивительно видеть, сколько усилий было вложено в решение различных проблем со звуком для Raspberry Pi. Очевидно, это должно быть самым слабым местом для новых пользователей, чтобы успешно развиваться и использовать ALSA под Raspbian. Потратив немало времени и усилий на то, чтобы заставить мой собственный звук RPi3 работать в разных версиях ОС, а также в других дистрибутивах Linux, я решил написать убедительную страницу с готовыми решениями. По крайней мере, для темы использования внешней звуковой карты на последней
Raspbian Stretch .
Звуковая система ALSA
ALSA предназначена для поддержки любых устройств на базе * nix, независимо от конфигурации оборудования и возраста оборудования. Нет нужды пытаться вникнуть в детали
20-летнего
развития. Мы просто применяем суть к текущей ситуации.
Однако ни разу в истории человечество не создавало такого количества бесполезных и дисфункциональных диаграмм, как для попытки объяснить ALSA. Единственно отдаленно информативными являются эти два:
Получение системной информации
Первый шаг - выяснить, какой звук, если таковой имеется, работает и какое оборудование у вас уже есть. Существуют всевозможные способы выяснения деталей, но для обычного человека большинство этих деталей не имеют смысла. Мы показываем самое главное.
Что мы хотим знать о нашей (звуковой) системе?
Мы хотим знать:
- название и версии встроенного звукового оборудования
- название и версии внешнего звукового оборудования
- какие драйверы ядра (модули) он использует
- какие другие драйверы / модули ядра связаны со звуком
- какие звуковые карты доступны
- в каком порядке используются звуковые карты и выбираются ОС и программами
- если есть какие-либо конфликтующие аппаратные или звуковые системные программы
Откуда вы хотите играть и записывать звук в вашей системе?
Ваши варианты воспроизведения звуков могут быть:
- От внутреннего 3,5 мм аудио разъем для наушников (аналоговый аудио)
- От HDMI подключенного экрана / монитора
- С внешней звуковой карты USB
- Из порта GPIO
Ваши варианты записи звуков могут быть:
- а. С внешней звуковой карты USB (как минимум с одним типом входа)
- б. Из файла или потока
- с. Из GPIO
В этом посте мы расскажем вам, как играть и записывать, используя внешнюю звуковую карту USB .
План успеха на будущее?
С обновлениями RPi постоянно происходят новые изменения и улучшения, часто ломающие старые решения. Идея здесь состоит в том, чтобы сделать как можно меньше изменений в системе или сделать их очевидными при необходимости. Это означает, что мы предпочитаем использовать пользовательскую конфигурацию, а не общесистемную. Т.е. попробуйте использовать файлы конфигурации в вашем домашнем каталоге, а не в системных файлах, принадлежащих root.
TL; DR (Пойдем уже!)
Перезагрузите и подключите вашу внешнюю USB-звуковую карту, чтобы мы начали на той же странице ...
А. Соберите немного информации
# Check ALSA modules
cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio
# Check sound hardware
cat /proc/asound/cards
0 [ALSA ]: bcm2835 - bcm2835 ALSA
bcm2835 ALSA
1 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed
# Check info on card-1
amixer -c 1
Simple mixer control 'Headphone',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 151
Mono:
Front Left: Playback 104 [69%] [-8.88dB] [on]
Front Right: Playback 104 [69%] [-8.88dB] [on]
Simple mixer control 'Mic',0
Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
Playback channels: Mono
Capture channels: Mono
Limits: Playback 0 - 32 Capture 0 - 16
Mono: Playback 23 [72%] [34.36dB] [off] Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [on]
Здесь мы видим, что система default ( card 0
) использует модуль bcm2835 ALSA. Хотя обычно мы можем указать, какую карту использовать, некоторые программы, такие как omxplayer
, не имеют этой опции и не могут воспроизводить звук различными способами.
На этом этапе вы уже можете попытаться настроить файлы конфигурации ALSA. Некоторые из них успешны, а другие нет, потому что не очевидно, как и где это должно быть сделано. В конечном итоге мы хотим, чтобы наша система использовала нашу внешнюю звуковую карту USB.
Б. Удалить аудио раздутый
Если у вас нет веских причин сохранить PulseAudio (PA) или
дополнительное программное обеспечение JACK- сервера, вы должны удалить их , если они есть. Они имеют тенденцию мешать ALSA, поскольку они берут под контроль многие функции ALSA, и все необходимые им дополнительные конфигурации делают вещи невероятно запутанными!
sudo apt-get remove pulseaudio
# You can keep `jack*`, but make sure it is not running.
# If it is running you need to stop it, disble it or remove it.
service --status-all
# Disable the running service with:
sudo systemctl disable xxxxx
C. Отключить внутреннюю (Broadcom) звуковую карту
Внутренняя звуковая карта управляется модулем ядра в:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
Если вы не планируете использовать аудиоразъем (в 1) или HDMI (в 2), вы должны отключить этот модуль ядра. Есть два способа сделать это.
- Отключите его с флагом конфигурации загрузки
- Запретить его загрузку в ядро
modprobe.d
демоном
Стараясь придерживаться нашего минималистического подхода, мы выбираем (1).
# Edit boot config with:
sudo nano /boot/config.txt
# so that:
cat /boot/config.txt
...
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
dtparam=audio=off
...
# You need to reboot!
sudo reboot now
Если по какой-то причине вы предпочитаете использовать метод (2), то вам нужно занести в черный список модуль ядра. Для этого просто введите слово blacklist
, а затем имя модуля в любом *.conf
файле /etc/modprobe.d/
. Однако там уже есть пустой, зарезервированный файл, вызванный raspi-blacklist.conf
для этой цели. Однако через 6 месяцев вы забудете об этом и о том, что в нем содержится, поэтому вам лучше назвать его после того, как модуль занесен в черный список.
cd /etc/modprobe.d/
# Manually edit a new file: blacklist-snd_bcm2835.conf
#sudo nano blacklist-snd_bcm2835.conf
# And add the line: blacklist snd_bcm2835
## OR directly with:
sudo tee /etc/modprobe.d/blacklist-snd_bcm2835.conf <<EOF
blacklist snd_bcm2835
EOF
# You need to reboot!
sudo reboot now
Какая разница? Нет, AFAICT.
После перезагрузки перепроверьте свои звуковые модули.
$ cat /proc/asound/modules
1 snd_usb_audio
$ cat /proc/asound/cards
1 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed
Bom! Ваш раздражающий bcm2835 ( card 0
) больше нет, но индекс USB-карты такой же! Это на самом деле хорошо.
Настройте свой ALSA
Как я уже упоминал, мы хотим, чтобы ALSA по умолчанию использовала собственную звуковую карту USB. Это также означает, что мы хотим, чтобы он имел первый доступный индекс в списке звуковых модулей ядра. Поскольку модуль был удален выше, а индекс такой же (карточка 1), мы в порядке. Но в случае, если нам нужно снова загрузить bcm2835, это не так, так как этот модуль снова появится как первый ( card 0
).
Нам просто нужно сообщить ALSA, каким должен быть индекс карты PCM по умолчанию
и в каком порядке они должны быть приоритетными в ядре.
Есть 3 места, где вы можете настроить свой ALSA.
- пользователем конфигурации в:
~/.asoundrc
- система конфигурации в:
/usr/share/alsa/alsa.conf
- модуль системы конф в:
/lib/modprobe.d/aliases.conf
Первые 2 изменяют устройства по умолчанию, тогда как последние обеспечивают порядок появления.
Сначала мы исправляем нашу пользовательскую конфигурацию для использования card 1
. Если у вас отображается более одной карты, выберите индекс, который вы хотите использовать по умолчанию.
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
Далее мы исправляем конфигурацию системы, используя те же номера карт, что и выше. Мы должны сделать это, потому что некоторые системные пакеты никогда не увидят ваш пользовательский конфигурационный файл.
sudo nano /usr/share/alsa/alsa.conf
# then replace:
#defaults.ctl.card 0
#defaults.pcm.card 0
# with:
defaults.ctl.card 1
defaults.pcm.card 1
Теперь перезагрузитесь, чтобы изменения вступили в силу.
Теперь у вас должна быть работающая аудиосистема.
Давайте проверим это!
Чтобы выполнить надлежащий тест, вам нужны соответствующие файлы для тестирования. Поэтому прежде всего убедитесь, что все ваши звуковые и видео файлы действительно работают.
(Я потратил немало времени, пытаясь получить тестовое видео h264 / mp4 для воспроизведения звука, но позже обнаружил, что на нем никогда не было закодированного звука!
ПРЕДУПРЕЖДЕНИЕ. Если вы пытаетесь протестировать видео, в которых используются
кодеки MPEG-2
или VC-1
, необходимо
купить (!) Ключ кодека
в организации RPi, чтобы иметь возможность полностью декодировать его с помощью встроенных аппаратных декодеров. В противном случае вам нужно сначала конвертировать файлы.
Вы можете проверить, включен ли ваш кодек с помощью:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
Вам понадобятся некоторые проверенные файлы для тестирования. Вы можете скачать и использовать их, если у вас их нет.
# get some demo sound and video files
cd ~/Music
wget -Lk http://rpf.io/lamp3 -O example_11k.mp3
wget -Lk http://www.kozco.com/tech/piano2-CoolEdit.mp3 -O pianoTest_48k.mp3
wget -Lk http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_2mb.mp4 -O bbb_720p_2mb.mp4
wget -Lk https://raw.githubusercontent.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4 -O bbb_360_22k.mp4
Далее давайте играть !!
# Double-check!
aplay -l && arecord -l
**** List of PLAYBACK Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
**** List of CAPTURE Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
# Play white noise on 2-channels (L/R) on Card-1
speaker-test -c2 -D hw:1,0
# Play a WAV sound file
speaker-test -c2 -D hw:1,0 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav
# Once the correct default card+device is set, and after reboot,
# then full left/right voice test (above) is performed, just by:
speaker-test -c2 -twav
# Record some sounds (with a VU bar):
arecord --device=hw:1,0 --format S16_LE --rate 44100 -c1 -V mono test.wav
# Play recorded sounds
aplay -D plughw:1,0 test.wav
# Play recorded sounds (sample rate have to be equal)
speaker-test -c2 -D plughw:1,0 -r 44100 --test=wav -W $HOME -w test.wav
# Install an MP3 player
sudo apt-get install mpg123
# Play some MP3 file
mpg123 -v -r 44100 some.mp3
# Play an MP3 sound stream
mpg123 http://ice1.somafm.com/u80s-128-mp3
# This plays video, but no sound!
omxplayer -o alsa /opt/vc/src/hello_pi/hello_video/test.h264
# This plays video and sound!
omxplayer -o alsa bbb_720p_2mb.mp4
# The following plays sometimes (!?) and at the wrong speed!
omxplayer -o alsa some.mp3
ТЫ ХОРОШО ИДТИ!
[опционально] Заказ дополнительного аудиооборудования
ПРИМЕЧАНИЕ. Если вы используете этот раздел, вам нужно изменить все значения карт в указанных выше разделах!
Если вы подключили дополнительное аудиооборудование, и оно не отображается так, как вы хотите, вы можете изменить порядок расположения модулей в /lib/modprobe.d/aliases.conf
файле.
Некоторые решения предложили внести изменения в этот файл. К сожалению, они не знают, что звуковой модуль USB RPi по умолчанию написан с ошибкой! Таким образом, изменения никогда не вступают в силу. Звуковой модуль ядра, с которым мы имеем дело, называется snd_usb_audio
и нет snd-usb-audio
. Имя файла snd-usb-audio.ko
и находится в: /lib/modules/4.9.59-v7+/kernel/sound/usb/
.
Достаточно забавно, текст в файле говорит, что это не должно быть изменено!
sudo nano /lib/modprobe.d/aliases.conf
#--------------------------------------
# For original (out-of-box) use
#--------------------------------------
# replace this:
options snd-usb-audio index=-2
# with this:
options snd_usb_audio index=-2
#--------------------------------------
# To change the index & order
#--------------------------------------
# Set the index value of the cards:
options snd_usb_audio index=0
options snd_bcm2835 index=1
# Set the order:
options snd slots=snd_usb_audio,snd_bcm2835
Ссылки:
aplay
последовательно ничего не делал после всей этой работы, пока я не использовал-D plughw:0,0
вместо этого-D hw:0,0
(на основе shttps: //raspberrypi.stackexchange.com/a/89162). К сожалению, хотя почти все теперь могут воспроизводить звук через USB, утилита, которая мне нужна больше всего (vban_receptor
), по-прежнему не работает, но на данный момент это почти наверняка уже не ошибка установкиplughw
вместоhw
. КСТАТИ. Посколькуhw
речь идет о аппаратном обеспечении, а приplughw
некоторой обработке, вы можете проверить, что вы на самом деле пытаетесь играть./usr/share/sounds/alsa
(в частностиFront_Center.wav
)