Linux 使用 VLC 投放媒體至 Chromecast
話說春節期間從自家的硬體庫存裡,翻出了一顆未曾用過的 Chromecast(二代,NC2-6A5),就想說在 Linux(Fedora 30)上思考看看可以如何使用。不過仍需要在 Android 或 iOS 上,使用 Google Home 應用程式來進行 Chromecast 裝置的初始設定,由於這部份並無可在 Linux 上完成的途徑,所以本文也不會對此多做描述。
完成 Chromecast 初始設定後,在 Linux 上最單純的應用方式,應該是安裝及使用 Google Chrome 瀏覽器。其內建的投放(Cast)功能,能夠搜尋同一網路下可用的 Chromecast,接著就可以將瀏覽器上所開啟的網頁或媒體,投放至 Chromecast 所連接的電視或螢幕上。除此之外也可以投放指定的應用程式視窗,或者是投放整個桌面畫面 。
不過論及媒體支援能力,DR 覺得諸如 VLC 這類多媒體播放程式仍是較健全的解決方案,於是就試了一下如何透過 VLC 輸出媒體至 Chromecast。VLC 自 3.0.0 版起便支援串流至 Chromecast,一般的操作情境,是前往 VLC 選單上的【Playback】→【Renderer】,這時 VLC 會自動找尋網路上是否有 Chromecast 裝置,若有便會陳列出來。使用者選取後,接著再播放媒體就會是串流至 Chromecast 而非在電腦上播放。
然而 VLC 的 Chromecast 搜尋功能,不一定都能夠順利運作(本文稍後會說明相關的疑難排解方式)。因此或許最可靠的手段,是直接在 VLC 裡給定 Chromecast 的 IP 位址。Chromecast 的 IP 位址可在 Google Home 應用程式裡查詢到,或者從 Linux 端也有多種方式可以查詢。舉例來說,假設所在的網段為 192.168.1.0/24,則單純用 Nmap 掃主機名稱大概就可以找出來:
- nmap -sn 192.168.1.0/24
假設已得知 Chromecast 的 IP 位址為 192.168.1.108,便可使用以下指令開啟 VLC:
- vlc --sout "#chromecast" --sout-chromecast-ip=192.168.1.108 --demux-filter=demux_chromecast
該 IP 位址就會被指定為後續操作的輸出目標,而前述指令同樣也可以加上媒體來源,直接進行播放的動作。例如將 DVD 串流至 Chromecast 播放的指令如下:
- vlc dvdsimple:// --sout "#chromecast" --sout-chromecast-ip=192.168.1.108 --demux-filter=demux_chromecast
以上便是 VLC 直接連接 Chromecast 的方式,那麼接著回頭來談 VLC 是如何搜尋 Chromecast 的。作為對比,首先得說明一下 Google Chrome 尋找 Chromecast 的方式。Chrome 瀏覽器會使用兩種方式,第一種是 SSDP,群播位址為 239.255.255.250:1900;第二種則是 mDNS,群播位址為 224.0.0.251:5353。
至於 VLC 僅僅是使用第二種,也就是 mDNS 來找尋 Chromecast。而疑難排解的首要步驟,應是先確認所安裝的 VLC 版本是否有包含與 microdns 函式庫相關的模組:
- vlc --list|grep microdns
倘若 VLC 的安裝來源為 RPM Fusion,那麼應該已包含所需的模組。在確認模組有載入的情況下,於終端機下執行「vlc -vvv」,接著再操作【Playback】→【Renderer】。若終端機有輸出諸如以下訊息,便表示 VLC 確實正在透過 mDNS 找尋 Chromecast:
qt interface debug: starting renderer discovery service mDNS renderer Discovery
main renderer discovery debug: looking for renderer_discovery module matching "microdns_renderer": 1 candidates
microdns renderer discovery debug: mDNS: listening to _googlecast._tcp.local renderer
main renderer discovery debug: using renderer_discovery module "microdns"
然而 DR 遇到的一個狀況,是 Chromecast 依預設情形以無線 Wi-Fi 連接,但倘若電腦是以有線方式連接至網路,會出現 Chrome 搜尋得到 Chromecast、但 VLC 搜尋不到的情形。反之若是電腦也用無線 Wi-Fi 連接,則 VLC 也可以搜尋到 Chromecast。當下網路環境的配置其實相當單純,無論有線或無線都是直連中華電信的 Zyxel P874 數據機,由數據機同時作為路由器及 Wi-Fi 分享器,並使用內建的 DHCP 分配網路位址。
如同前文曾提及的,Chrome 會使用兩種方式來尋找 Chromecast(SSDP 及 mDNS),而 VLC 僅會使用第二種方式。對此,在 Fedora 上可以分別使用以下指令,來測試是否可透過 SSDP 或 mDNS 找尋到 Chromecast 的 IP:
- gssdp-discover -i enp4s0(enp4s0 為網卡介面名稱)
- avahi-browse -art
前述指令分別來自 gupnp-tools 與 avahi-tools 套件。測試顯示,確實在電腦用有線連接的情況下,使用 gssdp-discover 以 SSDP 找尋 Chromecast 仍會成功,但使用 avahi-browse 查詢 mDNS 則會變成沒有結果。若使用 tcpdump 查看,可以看到查詢封包都有送出,但並無裝置做出回應。於是搜查了一輪網路上可見的資料,登入數據機的設定介面,測試將【Advanced Setup】→【LAN】的【Enable IGMP Snooping】取消勾選,再 Save 儲存,發現此問題就消除了。在有線連接下,基於 avahi-daemon 的 avahi-browse、以及基於 microdns 的 VLC 都會成功找到 Chromecast。
使用 avahi-browse 進行測試還需要留意一件事,就是 avahi-daemon 本身有快取機制。若要清除已保存的記錄,可先執行「sudo avahi-daemon --kill」將服務關閉,再由 avahi-browse 執行時自動重啟服務。
不過總結來說,針對 VLC 與 Chromecast 之間的應用情形,儘管裝置搜尋方面可能會受到一些網路設備與配置上的影響,但也可以用直接給定 IP 的連接方式來加以規避。
延伸閱讀: