音訊共享可以將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 # 更改它.sudo firewall-cmd --add-rich-rule="rule family=ipv4 目標地址=$address port port=$port protocol=tcp Accept"sudofirewall - cmd --add-rich-rule="規則族=ipv4目標位址=$位址連接埠=$埠協定=udp接受"sudo firewall-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 # 更改它。 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 音效卡可在揚聲器未插入時使音訊端點可用。然後音頻端點就會出現。其他聲卡可能有類似的選項。如果找不到,則轉向方法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 根據許可證獲得許可。
莫斯科利亞
於煥田