最近更新: 2016-12-27

使用命令列程式指定播放音效的音效裝置

同事在 linux 上設計一套基於影片的 Kiosk 導覽系統時,想在使用者操作時加入一些音效或語音提示。然而這個導覽系統本身會持續播放影片與聲音,故他必須在保持影片播放動作的狀態下,同時混入操作音效。

此外,在目標系統上,預期會有兩個音效裝置,即主機板內建音效裝置,和螢幕 HDMI 音效裝置。目標系統用螢幕喇叭,故也必須確保音效從 HDMI 音效裝置輸出。他希望用導覽系統內部呼叫命令列程式的方式簡單地實現這些需求。

三要件

  1. 安裝 PulseAudio 音效服務套件,並以此為主要音效管理員。 ALSA API 不支持共用模式。任一程式直接透過 ALSA API 播放音效時,其他程式就無法再開啟該音效裝置。
  2. 設定 PulseAudio 的預設輸出裝置為 HDMI 音效裝置。
  3. 用支持 PulseAudio 服務的命令列程式。例如 mplayer, mpv 或 paplay 。

不建議 aplay ,它需要加入特殊系統設置才能透過 PulseAudio 輸出音效 (參考 Adobe flash 設置),而且不接受 mp3/mp4 這類音樂格式。

mpv 用例:


$ mpv --no-audio-display audio.mp3

有些音樂檔內嵌封面圖片。 mpv 播放時會放置視窗顯示封面。在本文情境中,我們希望它不要顯示封面圖片,就加上選項 --no-audio-display

查看音效輸出裝置名稱與代號

上一節指定了預設音效裝置。通常播放軟體的聲音就會從預設音效裝置輸出。但我們希望在規劃導覽系統時,用更明確的方式指定音效裝置。為達此目的,我們需要知道音效裝置的名稱與代號。

安裝 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>

主要看兩行, indexnameindex 是裝置索引號碼,可以當作代號,但不保證順序固定。文字前綴有 * 者,就是預設播放裝置。 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 更為輕量,載入與播放更快。

相關文章