(很久沒寫文了! Orz)
Prerequisite
1. Windows
2. UPnP
How to check
先說明, 既然講UPnP. 那就是本地串流了..
然後既然UPnP協議, 那就前提就是要同網段了
(這不是絕對! 要看網路設備, 一般家用路由設備沒辦法提供對Multicast的額外控制)
有鑑於需要串流機支援UPnP協議, 請注意UPnP不等於DLNA..
DLNA是UPnP的另一個擴展(Extensions). 當然同樣適用!
對於串流來說, 就是一個簡單的Client-Server架構
也可以說那就是一個HTTP Server. 從系統架構設計來說HTTP Server就是一個API Gateway..
狹義的軟體架構角度來說, 那就是一個Farcade
(也可以有請大師Martin Fowler說明一個Gateway的軟體層面上的定義:
https://martinfowler.com/articles/gateway-pattern.html)
對於串流機扮演UPnP Client/Server來說, 一般都是用MIME確認音訊格式的支援能力..
也就是說, 即使硬件上支持某些格式, 不代表韌體能夠開出那些格式支援.
我比方說Denon的一些產品, 他雖然說官方說支援DSD格式
但是如果你通過第三方軟體去撥放DSD格式的音樂, 結果可能會不成功或著被on-the-fly transcoding
因為MIME送出來的格式就沒有包含對DSD的支援, 縱然原生提供的不太好用的HEOS能夠直接撥放
更別說假如UPnP的系統結構是棘手的巢狀結構, 那大概對第三方的相容性支持幾乎死一大片..
(不代表不能解決, 需要挑驗開發者的能力和願不願意支持)
那麼該如何檢查串流機能夠支持的音訊格式有哪些?
以往我是用一些開發工具拿查看(當然! 你也可以用Sniffer之類的工具去查封包), 不過那東西取得有點麻煩..
最簡單的就是用UPnP Tester工具
https://download.cnet.com/universal-plug-and-play-tester/3000-2085_4-10504740.html
前面提到過, 既然串流機作為HTTP Server成為一個API Gateway..
那麼對應的呼叫操作, 顯然他會暴露出相關的呼叫方法
通常常見的例如AVTransport等
當然! 一般使用者並不需要知道這些呼叫方法定義, 那是相關開發者需要理解的基礎..
我們只需要知道如何呼叫哪個方法來確認能夠支持的音訊格式即可
呼叫方法的對應: ConnectionManager => GetProtocoIInfo
UPnP Tester是極為輕巧的UPnP檢查工具, 免安裝即可使用..
1. 先打開UPnP Tester64
![[Quick Guide] 如何檢查串流機能夠支援的音訊格式](https://attach.mobile01.com/attach/202311/mobile01-fe8a6ac6a657d3aa472f456e9db79ef4.png)
原則上他會先打Multicast封包去掃. 最後在握手曝光當前支援UPnP的設備.
2. 如果呼叫GetProtocolInfo取得支援的音訊格式?
從上圖來說, 我們以Denon Home 350舉例
![[Quick Guide] 如何檢查串流機能夠支援的音訊格式](https://attach.mobile01.com/attach/202311/mobile01-815ebedcaf95aad2e6875ec19b952609.png)
找到曝光的ConnectionManager後, 選他滑鼠右鍵點擊"Properties"項目
會出現一個對話框能夠讓你Invoke在ConnectionManager支持的公開方法..
選取GetProtocolInfo後, 按下Invoke按鈕
![[Quick Guide] 如何檢查串流機能夠支援的音訊格式](https://attach.mobile01.com/attach/202311/mobile01-5e3f40c616ce431320ec526e4023f511.png)
之後你會得到一個回傳的訊息(Source)
![[Quick Guide] 如何檢查串流機能夠支援的音訊格式](https://attach.mobile01.com/attach/202311/mobile01-ebd41551034a4fc3ab2b7ee5899b3d7b.png)
3. 格式化回傳訊息
其實從Source回傳的訊息來看, 你已經取得當前串流機能夠支援的音訊格式了
選取Source後, 滑鼠右鍵Copy直接複製貼到筆記本上查看
你也可以用Notepad++, 直接使用字串取代把逗號(,)取代為換行符號(\n)
之後你便會得到比較容易閱讀的內容, 例如如下:
http-get:*:audio/mpeg:*
http-get:*:audio/vnd.dlna.adts:*
http-get:*:audio/x-ms-wma:*
http-get:*:audio/x-ms-wma:*
http-get:*:audio/L16;rate=48000;channels=2:*
http-get:*:audio/L16;rate=48000;channels=1:*
http-get:*:audio/L16;rate=44100;channels=2:*
http-get:*:audio/L16;rate=44100;channels=1:*
http-get:*:audio/wav:*
http-get:*:audio/mp3:*
http-get:*:audio/flac:*
http-get:*:audio/aac:*
http-get:*:audio/m4a:*
上面就是以Denon Home 350為主能夠支援的音訊格式. 他雖然說能夠支援DSD格式, 只是第三方沒辦法直接的支援
Q/A
1. 對於第三方的相容性?
這主要還是牽涉到串流機的UPnP結構, 以及他內部如何操作! 大多情況下能夠撥放, 但不是100%保證
2. 對於廠商號稱能支援的格式, 但是掃出來的MIME訊息沒看到?
這有一些解法:
a. 考驗開發者的能力: 有些開發者會想一些方法. 我舉例: TuneBrowser的開發者Tiki就想到額外壓送MIME的方式來讓串流機識別去支援
![[Quick Guide] 如何檢查串流機能夠支援的音訊格式](https://attach.mobile01.com/attach/202311/mobile01-98e95de6bf1d37bccc7d62c3f2986736.png)
這不是100%能夠解決, 但可以提供一種確認的方式來檢查.
(但是Tiki之前花很長的時間去跟一些Vendor打交道, 借設備來測相容性)
PS: TuneBrowser不支援DLNA
b. 請原廠(Vendor)想辦法提供支援: 這比較困難一點! 需要給Vendor施一些壓力. 不是每個原廠都願意吃下客戶的請求(Feature Request)
3. 完全不支援的格式?
通常除了彈出警告提示Unsupported format之外, 否則就是on-the-fly transcoding
(on-the-fly transcoding會需要付出re-encoding的代價)
4. 良好的撥放軟體?
沒有最好的撥放軟體, 只有對個人習慣適用的撥放軟體
例如最多人用的Foobar2000. 如果您覺得適用, 那您就不需要輕易換掉他.
除非你覺得有更好的選擇, 那就選擇吧!
雖然我還是得難免吐槽一下Foobar2000通過UPnP插件(Component)在設定上的複雜性
(我很久沒用他了, 我不知道他有沒有改了設計. 否則它原本的通訊方式, 我並不喜歡)
相容性一直都是第三方對於UPnP串流機支持的問題, 雖然大多情況下都能正常撥放
但是不代表只要一個號稱能支援UPnP的撥放軟體便能支持所有的串流機
我前面提過! 相容性! 再次強調. 當然如果第三方開發者懶得想方法的話
那就是無腦一刀切直接無條件on-the-fly transcoding, 直接先壓16b/44.1KHz送出(看甚麼格式, 通常FLAC比較友好)
大概幾乎都能解決!
5. 不是所有串流機能夠支持UPnP
不要因為有些廠牌的產品說支持串流, 就認為他會支持UPnP/DLNA
這會陷入慣性思維, 購買產品前請先跟Vendor再三確認
我前面先講過了. 這篇只會說明本地串流這塊
網路串流(Spotify, Tidal) 那是不同的情況
以上就這樣了! 謝謝惠顧.