音频共享可以将Windows/Linux计算机的音频通过网络共享到Android手机,让您的手机成为计算机的扬声器。 (您不需要购买新扬声器吗?。)
作为服务器的Windows或Linux PC一台。
Windows 10+ x86_64 与 Microsoft Visual C++ 2015-2022 可再发行组件 (x64) (vc_redist.x64.exe)。
Linux 与 PipeWire。
PC上的音频播放器可以正常工作。也就是说,您应该有一个声卡并且音频端点处于可用状态。否则,您需要一些额外的设置。
Android 6.0(API 23)+。
从最新版本下载 APK 文件和 AudioShareServer.exe。
打开计算机上的 AudioShareServer.exe。默认参数可能效果很好。但您可能仍然需要检查“主机”部分。通常是 LAN 地址,例如192.168.xxx.xxx
。确保您的手机可以通过该 IP 地址连接您的计算机。然后单击“启动服务器”按钮。
将 APK 安装到您的手机上并打开它。修改“Host”部分,确保与上一步的值相同,例如192.168.xxx.xxx
。单击“▶”按钮并欣赏音频?。
警告
此应用目前不支持自动重连功能。一旦应用程序被 Android 省电程序杀死或断开连接,音频播放将停止。建议将应用添加到省电白名单。为此,您可以在应用程序的设置中按“请求忽略电池优化”。
下载适用于Windows 的audio-share-server-cmd-windows.zip
,适用于Linux 的audio-share-server-cmd-linux.tar.gz
。
解压缩存档文件。
只需运行as-cmd -b
即可启动服务器。它将使用第一个 LAN 地址作为端口65530
的主机,并选择默认音频端点。大多数时候,它工作得很好。如果没有,请使用as-cmd -h
查看帮助,并设置正确的参数。
Windows 会要求您自动添加防火墙规则,而 Linux 则不会。因此,如果您的 Linux 发行版启用了防火墙,则需要手动配置防火墙。
将 APK 安装到您的手机上并打开它。修改“Host”部分,确保与上一步的值相同,例如192.168.xxx.xxx
。单击“▶”按钮并欣赏音频?。
地址=192.168.3.2 # 更改它.port=65530 # 更改它.sudofirewall-cmd --add-rich-rule="规则系列=ipv4目标地址=$地址端口端口=$端口协议=tcp接受"sudo防火墙-cmd --add-rich-rule="规则族=ipv4目标地址=$地址端口端口=$端口协议=udp接受"sudofirewall-cmd--runtime-to-permanent
sudo 防火墙-cmd --list-rich-rules
输出:
规则系列=“ipv4”目标地址=“192.168.3.2”端口端口=“65530”协议=“tcp”接受 规则系列=“ipv4”目标地址=“192.168.3.2”端口端口=“65530”协议=“udp”接受
地址=192.168.3.2 # 更改它。 port=65530 # 更改它。 sudofirewall-cmd --remove-rich-rule="规则系列=ipv4目标地址=$地址端口端口=$端口协议=tcp接受"sudo防火墙-cmd --remove-rich-rule="规则族=ipv4 目标地址=$地址端口端口=$端口协议=udp 接受"sudo firewall-cmd --runtime-to-permanent
音频格式有两种:
捕获音频格式
传输音频格式
传输音频格式为未压缩的PCM数据,与采集音频格式相同。
您可以打开server.log
来查看传输的音频格式。
[2024-10-26 14:52:48.967] [info] AudioFormat: encoding: ENCODING_PCM_16BIT channels: 2 sample_rate: 44100
如上图,编码为16 bit integer PCM
,通道数为2
,采样率为44.1kHz
。
在 Android 上,AudioTrack API 仅支持下面列出的 PCM 音频格式:
ENCODING_PCM_FLOAT ENCODING_PCM_8BIT ENCODING_PCM_16BIT ENCODING_PCM_24BIT_PACKED ENCODING_PCM_32BIT
https://developer.android.com/reference/android/media/AudioFormat#encoding
Audio Share 支持这 5 种 PCM 格式,但具体格式是否可用取决于音频端点。
在 Windows 上,默认捕获音频格式取决于音频端点的默认格式。您可以通过设置声音面板( mmsys.cpl
)来更改它。在“声音面板”的Playback
选项卡中,右键单击一个可用端点,然后打开“属性面板”,选择Advanced
选项卡,更改Default Format
,然后单击Apply
。如果您使用 Realtek 声卡,也可以在Realtek Audio Console
中完成此操作。捕获音频格式必须与音频端点具有相同的通道和采样率。所以如果你想改变它们,你只能打开声音面板并设置默认格式。为了兼容Linux, as-cmd
在Windows上仍然可以设置--channels
或--sample-rate
。但是,它会回退到正确的音频格式,因为它在大多数情况下不支持预期。
https://learn.microsoft.com/en-us/windows/win32/coreaudio/device-formats
在 Linux 上,默认的捕获音频格式可以完全由 PipeWire 给出。但是,默认音频编码可能是平面的,例如SPA_AUDIO_FORMAT_F32P
。 Android的AudioTrack无法播放。因此,默认音频编码强制为SPA_AUDIO_FORMAT_F32_LE
(32 位浮点 PCM,小端)。默认通道和采样率保持不变,由 PipeWire 给出。
请注意,降低编码位或采样率会降低网络带宽,但也会增加空白噪声,也称为音频损失。
您听到的最终音量受以下音量影响:
PC系统音量。
PC 上的音频播放器音量。
Android系统媒体音量。
Android 应用程序上的“音频音量”。
Android 应用程序上的“响度增强器”。
他们都是独立的。如果您将电脑和音频播放器的音量调到最大,但仍然觉得不够,但又不想更改Android系统音量,您可以在应用程序的“设置”中增加“响度增强器”。不会影响系统音量。应用程序上的“音频音量”可以在不改变系统音量的情况下降低您听到的音量。
声音太大会伤耳朵!!! “响度增强器”的限制为3000mB
。对于大多数情况来说就足够了。如果你还需要更大的响度,直接改变Android系统音量即可。
Realtek 声卡可以在扬声器未插入时使音频端点可用。只需打开 Realtek Audio Console,选择“设备高级设置”选项卡,然后打开“禁用前面板正面弹出对话框”选项。然后音频端点就会出现。其他声卡可能有类似的选项。如果找不到,则转向方法2。
目前,我还没有找到创建虚拟音频端点的方法。实现它的唯一方法是编写虚拟音频设备驱动程序。但它需要一个 EV 代码签名证书来对其进行签名。否则,用户无法安装。我不想付钱。并且存在许多第三方虚拟音频设备驱动程序。您可以在 Windows 上的虚拟音频设备驱动程序中找到或发布您知道的一个。通常,驱动程序都有一个 INF 文件。右键单击它并单击“安装”进行安装。
借助 PipeWire,即使没有 root 权限,Linux 也可以轻松创建虚拟音频端点。只需将以下配置复制到~/.config/pipewire/pipewire.conf.d/audio-share-sink.conf
context.objects = [ { factory = adapter args = { factory.name = support.null-audio-sink node.name = "Audio Share Sink" media.class = Audio/Sink object.linger = true audio.position = [ FL FR ] priority.session = 1009 priority.driver = 1009 monitor.channel-volumes = true monitor.passthrough = true } } ]
然后运行systemctl --user restart pipewire
来重新启动 PipeWire 服务。
最后,您可以看到添加的端点“Audio Share Sink”。
[abc@localhost ~]$ as-cmd -l [2024-03-17 22:46:14.563] [信息] pipeline header_version:0.3.48,library_version:0.3.67 endpoint_list: * id: 30 名称: 音频共享接收器 总计:1
安卓应用程序
Android Studio 将自动导入所有依赖项。
服务器MFC
安装依赖项需要 vcpkg。
运行vcpkg install asio protobuf spdlog[wchar] wil nlohmann-json
以安装 deps。 vcpkg 三元组是x64-windows-static-md
。
编译需要具有“使用 C++ 进行桌面开发”工作负载和“用于最新 v143 构建工具(x86 和 x64)的 C++ MFC”选项的 Visual Studio 2022。
服务器命令
需要 CMake 和编译器支持 C++20。 Linux 还需要libpipewire-dev
或pipewire-devel
。
安装 vcpkg,并设置VPCKG_ROOT
环境。 CMakePresets.json
需要此环境。
运行vcpkg install asio protobuf cxxopts
以安装 deps。对于 Windows,vcpkg 三元组是x64-windows-static-md
,对于 Linux,vcpkg 三元组是x64-linux
。另外,Windows 需要运行vcpkg install spdlog[wchar] wil
,Linux 需要运行vcpkg install spdlog
。
运行cmake --preset linux-Release
进行配置。
运行cmake --build --preset linux-Release
进行构建。 as-cmd
位于out/install/linux-Release/bin/as-cmd
。
对于 Windows,将前两步中的linux
替换为windows
。
该项目根据 Apache-2.0 许可证获得许可。
Copyright 2022-2024 mkckr0 <https://github.com/mkckr0> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
nlohmann/json 根据 MIT 许可证获得许可
WIL 获得 MIT 许可
Asio 根据 BSL-1.0 许可证获得许可。
Protocol Buffers 根据许可证获得许可。
spdlog 根据 MIT 许可证获得许可。
{fmt} 根据许可证获得许可。
cxxopts 根据 MIT 许可证获得许可
Netty 根据 Apache-2.0 许可证获得许可。
适用于 Android 的 Material Components 根据 Apache-2.0 许可证获得许可。
适用于 Gradle 的 Protobuf 插件已根据许可证获得许可。
PipeWire 根据许可证获得许可。
莫斯科利亚
于焕田