使用命令列程式指定播放音效的音效裝置
同事在 linux 上設計一套基於影片的 Kiosk 導覽系統時,想在使用者操作時加入一些音效或語音提示。然而這個導覽系統本身會持續播放影片與聲音,故他必須在保持影片播放動作的狀態下,同時混入操作音效。
此外,在目標系統上,預期會有兩個音效裝置,即主機板內建音效裝置,和螢幕 HDMI 音效裝置。目標系統用螢幕喇叭,故也必須確保音效從 HDMI 音效裝置輸出。他希望用導覽系統內部呼叫命令列程式的方式簡單地實現這些需求。
三要件
- 安裝 PulseAudio 音效服務套件,並以此為主要音效管理員。 ALSA API 不支持共用模式。任一程式直接透過 ALSA API 播放音效時,其他程式就無法再開啟該音效裝置。
- 設定 PulseAudio 的預設輸出裝置為 HDMI 音效裝置。
- 用支持 PulseAudio 服務的命令列程式。例如 mplayer, mpv 或 paplay 。
不建議 aplay ,它需要加入特殊系統設置才能透過 PulseAudio 輸出音效 (參考 Adobe flash 設置),而且不接受 mp3/mp4 這類音樂格式。
mpv 用例:
$ mpv --no-audio-display audio.mp3
查看音效輸出裝置名稱與代號
上一節指定了預設音效裝置。通常播放軟體的聲音就會從預設音效裝置輸出。但我們希望在規劃導覽系統時,用更明確的方式指定音效裝置。為達此目的,我們需要知道音效裝置的名稱與代號。
安裝 pulseaudio-utils 套件 (PulseAudio 命令列工具)。主要工具是 pacmd 。可參考 PulseAudio 命令列工具 。
1. 查看名稱或代號
在我的工作電腦上,有兩個音效輸出裝置。一個是主機板內建,另一個是 USB 外接音效卡。查看結果如下(已刪除很多不需要的訊息):
$ echo list-sinks | pacmd
* index: 0
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
index: 1
name: <alsa_output.usb-Burr-Brown_from_TI_USB_Audio_DAC-00-DAC.analog-stereo>
主要看兩行, index 和 name 。 index 是裝置索引號碼,可以當作代號,但不保證順序固定。文字前綴有 * 者,就是預設播放裝置。 name 是裝置識別名稱。系統中的每個音效裝置都有自己獨特的名稱,且通常固定不變。
2. 設定預設播放裝置
$ echo set-default-sink ? | pacmd
? 填上裝置代號或裝置識別名稱。
播放程式指定音效播放裝置
mpv/mplayer 指定播放裝置的選項是 --ao=pulse::?
(注意,要接兩個冒號)。 ? 填上音效裝置代號或識別名稱。在本文情境中宜用名稱指定播放裝置。名稱必須完整,不可略字。請參考上節內容查看裝置名稱。
用例:
$ paplay -d alsa_output.usb-Burr-Brown_from_TI_USB_Audio_DAC-00-DAC.analog-stereo test.wav
$ mpv --no-audio-display --ao=pulse::alsa_output.usb-Burr-Brown_from_TI_USB_Audio_DAC-00-DAC.analog-stereo test.mp3
paplay 是 PulseAudio 的命令列播放程式,只支持 au/wav 等少數音樂格式。但比 mpv 適合用在本文情境中。畢竟 paplay 更為輕量,載入與播放更快。