외장 USB 사운드 카드를 사용하고 기본값으로 설정하려면 어떻게해야합니까?


16

RPi3에서 실행 되는 C-Media 의 외부 USB 사운드 카드가 있습니다 . 카드 인덱스와 ALSA 플러그인을 지정 하여 aplay / arecord 를 사용하여 일부 레코딩을 재생할 수 있습니다 . 그러나 다른 많은 사운드 파일이 전혀 재생되지 않거나 예상대로 재생되지 않습니다. 다른 플레이어 소프트웨어도 작동하지 않습니다.

Q : 기본적으로 ALSA를 사용하도록 ALSA를 설정하려면 어떻게해야합니까?

답변:


32

배경

Raspberry Pi의 다양한 사운드 관련 문제를 해결하기 위해 얼마나 많은 노력을 기울 였는지 놀랍습니다. 새 사용자가 Raspbian에서 ALSA를 성공적으로 개발하고 사용하기에는 가장 약한 장소 여야합니다. 다른 OS 버전과 다른 Linux 배포판에서도 작동하는 자체 RPi3 사운드를 얻는 데 많은 시간과 노력을 들인 결과 결정적인 솔루션 페이지를 작성하기로 결정했습니다. 최소한 최신 Raspbian Stretch 에서 외부 사운드 카드를 사용하는 주제에 대해서는 .

ALSA 사운드 시스템

ALSA는 하드웨어 구성 및 하드웨어 수에 관계없이 모든 종류의 * nix 기반 장치를 지원합니다. 당연히, 개발 20 년 의 세부 사항을 이해하려는 시도에는 별다른 의미가 없습니다 . 우리는 단순히 본질을 현재 상황에 적용합니다.

그러나, 역사상 인류는 ALSA를 설명하려는 것처럼 쓸모없고 역기능적인 도표를 생산하지 못했습니다. 원격으로 유익한 유일한 것은 다음 두 가지입니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

시스템 정보 얻기

첫 번째 단계는 작동하는 소리와 작동하는 하드웨어를 파악하는 것입니다. 사람을 알아내는 방법에는 여러 가지가 있지만, 보통 사람에게는 대부분의 세부 사항이 의미가 없습니다. 우리는 가장 중요한 것을 보여줍니다.

우리의 (사운드) 시스템에 대해 무엇을 알고 싶습니까?

우리는 알고 싶다 :

  • 내장 사운드 하드웨어 이름 및 버전
  • 외부 사운드 하드웨어 이름 및 버전
  • 사용하는 커널 드라이버 (모듈)
  • 다른 사운드 관련 커널 드라이버 / 모듈이로드되는 것
  • 사용 가능한 사운드 카드
  • OS 및 프로그램에서 사운드 카드를 사용하고 선택하는 순서
  • 충돌하는 하드웨어 또는 사운드 시스템 프로그램이있는 경우

어디에서 시스템의 사운드를 재생하고 녹음 하시겠습니까?

소리 재생 옵션 은 다음과 같습니다.

  1. 내부 3.5mm 오디오 헤드폰 잭 (아날로그 오디오)
  2. HDMI 연결 화면 / 모니터에서
  3. 외부 USB 사운드 카드에서
  4. GPIO 포트에서

소리 녹음 옵션 은 다음과 같습니다.

  • ㅏ. 외부 USB 사운드 카드에서 (최소 한 유형의 입력)
  • 비. 파일 또는 스트림에서
  • 씨. GPIO에서

게시물 에서는 외부 USB 사운드 카드를 사용하여 재생 및 녹음 하는 방법에 대해 설명합니다 .

미래의 증거 성공 계획?

RPi의 업데이트에는 새로운 변경 사항과 개선 사항이 지속적으로 흐르며 종종 오래된 솔루션을 손상시킵니다. 여기서 아이디어는 시스템을 가능한 한 적게 변경하거나 필요한 경우 명확하게 변경하는 것입니다. 즉, 시스템 전체 구성보다 사용자 별 구성을 선호합니다. 즉, 루트 소유 시스템 파일이 아닌 홈 디렉토리에서 구성 파일을 사용하십시오.


TL; DR (이미 가자!)

외부 USB 사운드 카드를 재부팅하고 플러그인하여 동일한 페이지에서 시작하십시오 ...

A. 정보 수집

# 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]

여기서 시스템 기본값 ( card 0)이 bcm2835 ALSA 모듈을 사용하고 있음을 알 수 있습니다. 일반적으로 사용할 카드를 지정할 수 있지만 omxplayer 와 같은 일부 소프트웨어 에는이 옵션이 없으며 다양한 방법으로 사운드를 생성하지 못합니다.

이 시점에서 이미 ALSA 구성 파일을 구성하려고 시도 할 수 있습니다. 일부는 성공한 반면, 다른 방법은 어디에서 어떻게 수행해야하는지 명확하지 않기 때문에 그렇지 않습니다. 우리가 궁극적으로 원하는 것은 시스템에 외부 USB 사운드 카드를 사용하도록 지시하는 것입니다.

B. 오디오 블로 트 제거

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)를 사용하려는 경우가 아니면이 커널 모듈을 비활성화해야합니다. 이를 수행하는 두 가지 방법이 있습니다.

  1. 부팅 설정 플래그로 비활성화
  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

!! 성가신 bcm2835 ( card 0)는 사라졌지 만 USB 카드의 색인은 동일합니다! 이것은 실제로 좋습니다.

ALSA 구성

이미 언급했듯이 ALSA는 자체 USB 사운드 카드를 기본값으로 사용하기를 원합니다. 이는 커널 사운드 모듈 목록에서 첫 번째로 사용할 수있는 색인을 원한다는 것을 의미합니다. 모듈이 위에서 제거되었고 인덱스가 동일하기 때문에 (카드 1) 좋습니다. 그러나 bcm2835를 다시로드 해야하는 경우 해당 모듈이 첫 번째 모듈 ( card 0) 로 다시 표시 되므로 그렇지 않습니다 .

우리는 단순히 우리의 디폴트 PCM 카드 인덱스가 있어야한다 무엇 ALSA 말할 필요 하고 무엇을 그들이 커널에서 우선 순위가되어야한다 주문한다.

ALSA를 구성 할 수있는 위치는 3 곳입니다.

  • 사용자 설정 에서 :~/.asoundrc
  • 시스템 설정 에서 :/usr/share/alsa/alsa.conf
  • 시스템 모듈의 conf 에 :/lib/modprobe.d/aliases.conf

처음 2 개는 기본 장치를 변경하고 마지막 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 테스트 비디오를 얻는 데 상당한 시간을 보냈으며 나중에는 오디오를 인코딩하지 않았다는 것을 알게되었습니다! Duh!)

경고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파일 에서 모듈이 나타나는 순서를 강제로 다시 정렬 할 수 있습니다 .

일부 솔루션에서이 파일을 변경하도록 제안했습니다. 불행히도, 그들은 RPi 기본 USB 사운드 모듈의 철자가 틀렸다는 것을 알지 못합니다! 따라서 변경 사항이 적용되지 않습니다. 우리가 관심있는 사운드 커널 모듈은 호출 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

참고 문헌 :


Raspian과 함께 raspi 3B +를 aplay사용하는 -D plughw:0,0대신 -D hw:0,0(shttps : //raspberrypi.stackexchange.com/a/89162를 기반으로) 대신 사용할 때까지이 모든 작업을 수행 한 후에도 아무런 작업도 수행하지 않았습니다 . 불행히도, 거의 모든 것이 이제 USB를 통해 오디오를 재생할 수 vban_receptor있지만, 대부분의 작업을 수행해야하는 유틸리티 ( )는 여전히 작동하지 않지만이 시점에서 더 이상 설정 오류가 아닙니다.
Mike 'Pomax'Kamermans

1
예, 이것은 피의 악몽입니다. 다른 PCM 플러그인 목록은 여기를 참조하십시오 . 그런 다음 "ALSA 장치 및 플러그인" 이라는 첫 번째 섹션을 읽으 십시오 . 아마도 plughw대신에 사용해야 하는 이유를 밝히는 데 도움이 될 것 입니다 hw. BTW. 이후는 hw반면, 직선 하드웨어입니다 plughw일부 처리를 수행, 당신은 당신이 실제로 재생하려는 것을 확인 할 수 있습니다.
not2qubit

나는 /usr/share/sounds/alsa(특히, Front_Center.wav) 의 bog 표준 테스트 오디오 파일 중 하나를 사용하여 테스트했습니다.
Mike 'Pomax'Kamermans

1
당신은 절대 스타입니다. 나는 라즈베리 파이에서 소리를내는 것이 며칠 동안해야 할 일에 대한 명확한 지침이없는 프로젝트 일 것으로 기대하지 않았습니다. 당신을위한 모든 +1.
Kieran

3
공감 률이 너무 적은 것은 범죄입니다.
BradChesney79
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.