Scream 是 Windows 的虛擬裝置驅動程序,提供獨立的聲音裝置。透過此裝置播放的音訊作為 PCM 多重播放串流發佈在您的本機網路上。
網路上的接收器可以拾取串流並透過自己的音訊輸出播放它。接收器可用於 Unix/Linux(與 PulseAudio 或 ALSA 連接)和 Windows。
對於 QEMU 主機上的 Windows 用戶機的特殊場景,@martinellimarco 貢獻了對透過 IVSHMEM 驅動機制傳輸音訊的支持,類似於 GPU 直通軟體「Looking Glass」。請參閱下面有關 IVSHMEM 的部分。
Scream 基於微軟的 MSVAD 音訊驅動程式範例程式碼。原始程式碼在 MS-PL 下獲得許可,我的更改和添加也是如此。有關實際許可證文本,請參閱許可證。
GitHub 發布頁面上提供了包含 x64、x86 和 arm64 上 Windows 10 簽章版本的 ZIP 檔案。 「安裝程式」是一個批次文件,需要以管理員權限執行。
微軟最近收緊了核心驅動程式簽署規則。這些新規則適用於未從早期版本升級的較新的 Windows 10 安裝。如果您的安裝遵循這些規則,則驅動程式將不會安裝。
但是,如果存在以下任何例外情況,Windows 10 版本 1607(及更高版本)仍然接受交叉簽署的核心驅動程式:
解決方法#1:在 BIOS 中停用安全啟動。有關更多信息,請參閱此問題。
解決方法#2:新增此特殊登錄值:
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCIPolicy]
"UpgradedSystem"=dword:00000001
請查看以下資源以獲取更多資訊。
上述安裝方法不適用於 Windows pnputil
,因為安裝批次檔依賴於devcon-x64
,而該檔案與 Windows 11 不相容。 bcdedit
將 Windows 11 置於測試模式。若要安裝 Windows 11 的 Scream:
bcdedit /set testsigning on
。重新啟動計算機,並確保您在壁紙的右下角看到“測試模式”。/Install/driver//
。然後,發出: pnputil /add-driver .Scream.inf /install
。bcdedit /set testsigning off
。然後,重新啟動電腦。確保桌布右下角不存在「測試模式」訊息,以確保測試模式現在已停用。現在您應該在音訊設備中看到 Scream 音訊設備,並且可以繼續進行客戶端設定。 帶有 Pulseaudio、JACK 或 ALSA 的 Unix:不包含在安裝程式包中。請參閱 Receivers/unix 資料夾中的自述文件。各種貢獻者已經為此接收器編寫了程式碼:
Windows:ScreamReader,由@MrShoenel 貢獻。自 1.2 版起包含在安裝程式包中。此接收器不支援多通道(不僅僅是立體聲)設定的位置映射 - 這意味著揚聲器設定不匹配可能會導致通道在錯誤的位置播放。
支援 Scream 流的第 3 方接收器是 https://github.com/mincequi/cornrow。它主要適用於嵌入式設備。
@tomek-o 為低功耗嵌入式系統編寫了接收器,非常適合構建連接乙太網路的主動揚聲器。
接收器通常可以作為非特權使用者運作。具有輸入防火牆的接收器系統需要開啟 UDP 連接埠 4010或您使用的任何自訂連接埠。
透過 Scream 裝置播放的所有音訊將作為多播流放入本機 LAN(使用單播是可選的 - 請參閱下文)。延遲是最小的,因為所有處理都是在核心層級完成的。沒有使用者空間部分。
組播目標位址和連接埠為「239.255.77.77:4010」。音訊是原始 PCM 串流。預設取樣率和大小可以在驅動程式「進階」屬性頁中的「預設格式」中設定。預設揚聲器/聲道配置可以在 Scream 聲音設備的「配置」對話方塊中設定。
資料以 UDP 訊框的形式傳輸,有效負載大小為最大。 1157字節,由5字節頭和1152字節PCM資料組成。後一個數字可以被 4、6 和 8 整除,因此所有通道的完整樣本數將始終適合一個資料包。第一個標頭位元組表示取樣率。位元 7 指定基本速率:0 表示 48kHz,1 表示 44.1kHz。其他位元指定基本速率的乘數。第二個頭位元組表示採樣寬度,以位元為單位。第三個頭位元組表示正在傳輸的通道數。第四和第五個頭位元組組成了 Microsoft WAVEFORMATEXTENSIBLE 結構中的 DWORD dwChannelMask,描述了通道到揚聲器位置的對應。
接收器只需從網路讀取流並將其填充到本地音訊接收器。接收器系統的核心應該會自動執行必要的 IGMP 訊號,因此通常只需開啟一個多重播放偵聽套接字並開始從中讀取就足夠了。應採用最小緩衝(約 UDP 有效負載大小的 4 倍)來解決抖動問題。
為了滿足您的發燒友感受,或減少不必要的重採樣,您可能需要設定更高的採樣率和/或採樣寬度。您可以在驅動程式的「進階」屬性頁上執行此操作,如下所示。警告:將 24/32 位元寬度的高取樣頻率與多通道結合使用可能會導致網路上的高位元率。對於 5.1 或更高聲道模式,我們建議堅持使用 48kHz/16 位元;如果您要聽 CD 上的音樂,則建議使用 44.1kHz/16。
寬度=“700”/>
感謝 @martinellimarco 的出色工作,如果您的目標系統具有多通道揚聲器設置,您也可以將其擴展到 Windows。使用聲音設備驅動程式對話方塊的「配置」精靈,如下所示。請注意,這只是系統預設設置,應用程式軟體(如遊戲)可能需要進行自己的設定。
僅當多播給您帶來問題時才建議這樣做。按照此螢幕截圖中所述的方式調整註冊表(您必須建立「Options」項目),然後重新啟動:
如果存在靜默,靜默抑制將避免透過網路傳送資料。一旦處理了一定數量的連續無聲樣本,Scream 將停止發送資料。新增以下註冊表項 - 建議值為 10000 個樣本(44100Hz 時約 1/4 秒)。
按照此螢幕截圖中所述的方式調整註冊表(您必須建立「Options」項目),然後重新啟動:
️ 注意:雖然可以進行此設置,但通常僅在無法透過標準 virtio-net 設備使用網路傳輸時才建議這樣做。 QEMU 上的 Scream 不會從使用 IVSHMEM 中受益。由於實現的輪詢性質,它會增加 CPU 負載和延遲。
使用 QEMU/KVM 時,這可以用作預設網路傳輸的替代方案。
...
...
2
...
...
或者,對於那些不使用 libvirt 的人,這裡是 QEMU 命令列相關部分的範例:
...
-device ivshmem-plain,memdev=ivshmem_scream
-object memory-backend-file,id=ivshmem_scream,share=on,mem-path=/dev/shm/scream-ivshmem,size=2M
...
System Devices
節點中的PCI standard RAM Controller
必須使用上面下載的控制器進行手動更新。HKLMSYSTEMCurrentControlSetServicesScreamOptionsUseIVSHMEM
,其值為裝置大小(以 MB 為單位)(建議為 2)。請注意,尖叫將根據設備的大小來識別設備,因此您應該只擁有一個具有該特定大小的 IVSHMEM 設備。另請注意,您可能必須建立Options
鍵。您也可以將此指令貼到管理 CMD shell 中以建立金鑰和 DWORD: REG ADD HKLMSYSTEMCurrentControlSetServicesScreamOptions /v UseIVSHMEM /t REG_DWORD /d 2
scream -m /dev/shm/scream-ivshmem
需要 Visual Studio 和最新的 WDK。祝你好運!