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 11,因为安装批处理文件依赖于devcon-x64
,而该文件与 Windows 11 不兼容。您可以使用替代方法安装 Windows 11 的未签名驱动程序,利用 devcon 的后继者pnputil
和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。祝你好运!