पृष्ठभूमि
यह देखना आश्चर्यजनक है कि रास्पबेरी पाई के लिए विभिन्न ध्वनि संबंधी समस्याओं को हल करने की कोशिश में कितना प्रयास किया गया है। जाहिरा तौर पर यह नए उपयोगकर्ताओं के लिए रास्पियन के तहत ALSA के साथ सफलतापूर्वक विकसित और उपयोग करने के लिए सबसे कमजोर स्थान होना चाहिए। विभिन्न OS संस्करणों और अन्य लिनक्स वितरणों में काम करने के लिए अपना खुद का RPi3 साउंड प्राप्त करने के लिए काफी समय और प्रयास खर्च करने के बाद, मैंने निर्णायक टू-गो-समाधान पृष्ठ लिखने का फैसला किया है। कम से कम नवीनतम रस्पियन स्ट्रेच पर एक बाहरी साउंड कार्ड का उपयोग करने के विषय के लिए
।
ALSA साउंड सिस्टम
ALSA का मतलब किसी भी तरह के * nix आधारित डिवाइस को सपोर्ट करना है, चाहे इसका हार्डवेयर कॉन्फ़िगरेशन कुछ भी हो और चाहे कितना भी पुराना हार्डवेयर हो। अनावश्यक रूप से,
इसके विकास के 20 वर्षों के विवरण में जाने की कोशिश करने का कोई मतलब
नहीं है। हम बस एक मौजूदा स्थिति में सार को लागू करते हैं।
हालांकि, इतिहास में किसी भी समय मानव जाति ने बेकार और बेकार के आरेखों की इतनी मात्रा में उत्पादन नहीं किया है, जितना कि एसटीए को समझाने की कोशिश के लिए। केवल दूरस्थ सूचनात्मक ये दो हैं:
सिस्टम जानकारी प्राप्त करना
पहला कदम यह पता लगाना है कि क्या ध्वनि, यदि कोई हो, काम करता है और आपके पास पहले से क्या हार्डवेयर है। Detals का पता लगाने के सभी प्रकार हैं, लेकिन औसत व्यक्ति के लिए, उन विवरणों में से अधिकांश अर्थहीन हैं। हम सबसे महत्वपूर्ण दिखाते हैं।
हम अपने (ध्वनि) प्रणाली के बारे में क्या जानना चाहते हैं?
हम जानना चाहते हैं:
- अंतर्निहित ध्वनि हार्डवेयर नाम और संस्करण
- बाहरी ध्वनि हार्डवेयर नाम और संस्करण
- कर्नेल ड्राइवर (मॉड्यूल) इसका क्या उपयोग करते हैं
- अन्य ध्वनि संबंधित कर्नेल ड्राइवर / मॉड्यूल लोड किए गए हैं
- क्या साउंड कार्ड उपलब्ध हैं
- किस क्रम में साउंड कार्ड का उपयोग किया जाता है और ओएस और कार्यक्रमों द्वारा चुना जाता है
- अगर कोई परस्पर विरोधी हार्डवेयर या साउंड सिस्टम प्रोग्राम हैं
आप अपने सिस्टम पर साउंड कहां से खेलना और रिकॉर्ड करना चाहते हैं?
ध्वनियाँ बजाने के लिए आपके विकल्प , हो सकते हैं:
- आंतरिक 3.5 मिमी ऑडियो हेडफोन जैक (एनालॉग ऑडियो) से
- एचडीएमआई कनेक्टेड स्क्रीन / मॉनिटर से
- बाहरी USB साउंड कार्ड से
- GPIO पोर्ट से
ध्वनियों की रिकॉर्डिंग के लिए आपके विकल्प , हो सकते हैं:
- ए। बाहरी USB साउंड-कार्ड से (कम से कम एक प्रकार के इनपुट के साथ)
- ख। किसी फ़ाइल या स्ट्रीम से
- सी। एक GPIO से
में इस पोस्ट, हम आपको बता कैसे होगा खेलते हैं और बाहरी USB साउंड कार्ड का उपयोग कर रिकॉर्ड ।
एक भविष्य के सबूत सफलता की योजना?
आरपीआई के अपडेट के साथ नए परिवर्तनों और सुधारों का एक निरंतर प्रवाह होता है, अक्सर पुराने समाधानों को तोड़ते हैं। यहाँ पर विचार यह है कि सिस्टम में कम से कम बदलाव करें या जरूरत पड़ने पर उन्हें स्पष्ट करें। इसका मतलब है, हम सिस्टम द्वारा विस्तृत की तुलना में एक उप-उपयोगकर्ता कॉन्फ़िगरेशन का उपयोग करना पसंद करते हैं। यानी रूट स्वामित्व वाली सिस्टम फ़ाइलों के बजाय, अपने घर निर्देशिका में कॉन्फ़िगरेशन फ़ाइलों का उपयोग करने का प्रयास करें।
टीएल; डीआर (चलो पहले से ही जा रहा है!)
अपने बाहरी 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]
यहां हम देखते हैं कि सिस्टम डिफ़ॉल्ट ( card 0
) bcm2835 ALSA मॉड्यूल का उपयोग कर रहा है। यद्यपि हम आम तौर पर निर्दिष्ट कर सकते हैं कि किस कार्ड का उपयोग करना है, कुछ सॉफ्टवेयर जैसे omxplayer के
पास यह विकल्प नहीं है, और विभिन्न तरीकों से किसी भी ध्वनि का उत्पादन करने में विफल रहेगा।
इस बिंदु पर आप पहले से ही अपनी ALSA कॉन्फ़िगर फ़ाइलों को कॉन्फ़िगर करने का प्रयास कर सकते हैं। कुछ सफल हैं, जबकि कई अन्य नहीं हैं क्योंकि यह स्पष्ट नहीं है कि यह कैसे और कहां किया जाना चाहिए। आखिरकार हम क्या चाहते हैं, हमारे सिस्टम को हमारे बाहरी यूएसबी साउंड कार्ड का उपयोग करने के लिए कहना है।
B. ऑडियो ब्लोट निकालें
जब तक आपके पास PulseAudio (PA) या
अतिरिक्त JACK सर्वर सॉफ़्टवेयर रखने के बहुत अच्छे कारण नहीं हैं, तब तक आपको उन्हें अनइंस्टॉल कर देना चाहिए , यदि वे वहां हैं। वे एएलएसए के साथ हस्तक्षेप करने की प्रवृत्ति रखते हैं, क्योंकि वे कई एएलएसए कार्यों को नियंत्रित करते हैं, और उन लोगों द्वारा आवश्यक सभी अतिरिक्त कॉन्फ़िगरेशन, चीजों को अविश्वसनीय रूप से भ्रमित करते हैं!
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. आंतरिक (ब्रॉडकॉम) साउंड कार्ड को अक्षम करें
आंतरिक साउंडकार्ड कर्नेल मॉड्यूल द्वारा संचालित होता है:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
जब तक आप ऑडियो जैक (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
)।
हमें केवल ALSA को यह बताने की आवश्यकता है कि हमारे डिफॉल्ट PCM कार्ड इंडेक्स क्या होने चाहिए
और किस क्रम में उन्हें कर्नेल में प्राथमिकता दी जानी चाहिए।
3 स्थान हैं जहां आप अपने ALSA को कॉन्फ़िगर कर सकते हैं।
- उपयोगकर्ता config में:
~/.asoundrc
- प्रणाली config में:
/usr/share/alsa/alsa.conf
- सिस्टम मॉड्यूल 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
कोडेक्स का उपयोग करते हैं, तो आपको
आरपीआई संगठन से एक कोडेक कुंजी खरीदनी होगी ( बिल्ट-इन हार्डवेयर डिकोडर्स के साथ इसे पूरी तरह से डिकोड करने में सक्षम होने के लिए। अन्यथा, आपको पहले फ़ाइलों को परिवर्तित करने की आवश्यकता है।
आप देख सकते हैं कि क्या आपका कोडक सक्षम है:
# 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
फ़ाइल में।
कुछ समाधानों ने इस फाइल में बदलाव करने का प्रस्ताव दिया है। दुर्भाग्य से, उन्हें पता नहीं है कि आरपीआई डिफ़ॉल्ट यूएसबी साउंड मॉड्यूल गलत वर्तनी है! इसलिए परिवर्तन कभी प्रभावी नहीं होते हैं। ध्वनि कर्नेल मॉड्यूल जिसका हम संबंध रखते हैं, कहा जाता है 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) का उपयोग किया। दुर्भाग्य से, जबकि लगभग हर चीज अब यूएसबी पर ऑडियो चला सकती है, जिस उपयोगिता के लिए मुझे सबसे अधिक काम करने की आवश्यकता है (vban_receptor
) अभी भी काम नहीं करता है, लेकिन इस समय यह लगभग निश्चित रूप से सेटअप की गलती नहीं है