樹(shù)莓派指定聲卡硬件播放聲音

樹(shù)莓派自身的版卡都帶了博通的聲卡設(shè)備, 但是遇到樹(shù)莓派 zero 這種沒(méi)有3.5mm插口的時(shí)候就比較郁悶.

一般我們用下面方式去禁用樹(shù)莓派的板載聲卡:

sudo nano /boot/config.txt

把文件中的 dtparam=audio=on 改成 dtparam=audio=off
cat /proc/asound/cards

這個(gè)命令查詢(xún)聲卡 id, 比如我們需要聲卡 id 為1 的聲卡設(shè)備, 記錄備用
修改 ~/.asoundrc 配置
文件的內(nèi)容如下, card id 為 1
pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
修改 alsa.conf 配置
替換 /usr/share/alsa/alsa.conf 文件中的 
defaults.ctl.card 0
defaults.pcm.card 0

改成

defaults.ctl.card 1
defaults.pcm.card 1

這樣就可以讓樹(shù)莓派指定使用id為1的聲卡設(shè)備去播放聲音了, 但是坑爹的事情還沒(méi)有完, 因?yàn)長(zhǎng)inux設(shè)備如果插拔和重啟的時(shí)候, 聲卡設(shè)備的 id 分配是完全靠?jī)?nèi)核心情的, 你這次調(diào)用的是 id 1的聲卡設(shè)備, 下次就有可能變成 0 和 2等其他 id. 遇到這種情況, 如果聲卡設(shè)備只有麥克風(fēng)而沒(méi)有揚(yáng)聲器(比如USB攝像頭), 就會(huì)報(bào) jack server 的錯(cuò)誤, 無(wú)法正常發(fā)出聲音.

怎么辦?

/proc/asound/pcm 文件中會(huì)有所有聲卡設(shè)備的 "設(shè)備號(hào)-序列號(hào)" 的信息, 我們只用

  1. 打開(kāi) /proc/asound/pcm 文件, 過(guò)濾出具有 playback 1 的設(shè)備
  2. 提取出 "設(shè)備號(hào)-序列號(hào)" 的信息
  3. 通過(guò) mpg123 指定 設(shè)備號(hào)-序列號(hào) 信息, 即可播放指定聲卡硬件播放聲音

示例代碼如下:

def get_sound_card_id():
    try:
        with open("/proc/asound/pcm") as f:
            s = f.read()
            for line in s.split("\n"):
                if "playback 1" in line:
                    number = line.split(":")[0].split("-")
                    return ("%s,%s" % (int(number[0]), int(number[1])))
    except:
        return "0,0"

def play_sound(sound_file):
    sound_card_id = get_sound_card_id()

    play_command = "mpg123 -o alsa -a hw:%s %s" % (sound_card_id, sound_file)
    subprocess.Popen(play_command, shell=True)

玩樹(shù)莓派還是Python好啊, 輕描淡寫(xiě)幾行代碼就搞定了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容