# 疑難排解

自動重新連線、/ssvc status、錯誤訊息、開發者模式與常見問題

Source: https://socketsvc.vercel.app/zh-TW/client/troubleshooting
## 自動重新連線 [#automatic-reconnection]

語音成功連線後，如果因為網路或語音服務而中斷，只要你還在同一個 Minecraft 伺服器上，用戶端就會自動申請新的一次性權杖並重新連線，**不必**執行 `/ssvc reconnect`。

| 項目 | 行為 |
| --- | --- |
| 重試間隔 | 每次失敗後依序等待 5、10、20、30 秒，之後最多每 30 秒重試一次 |
| 逾時 | 等待權杖回應與開啟 WebSocket 各自在 30 秒後逾時 |
| 退避重設 | 連線維持 30 秒後重設 |
| 斷線偵測 | 每 10 秒送一次 WebSocket ping/pong，即使沒人說話也能發現連線已失效；重試間隔從發現的那一刻起算 |
| 權杖 | 每次嘗試都會申請全新的一次性權杖；失敗的權杖一律不快取、不重複使用。權杖的 30 秒有效期只用於准許連線，已建立的連線不必定期更新 |
| 保留的狀態 | 恢復連線後，靜音／停止接收語音與首次使用的隱私設定都會保留 |
| 通知 | 連續失敗時，聊天室只會通知一次，直到語音恢復為止；設定畫面會顯示「語音將自動重新連線」，HUD 則顯示「重新連線中...」 |

即使代理伺服器沒有公告外掛頻道，只要先前曾連上語音，這次遊戲連線仍可申請新權杖，前提是伺服器支援 `socketsvc:handshake_request`。沒有安裝 SocketSVC 的伺服器則會安靜地維持離線。

**以下情況會停止自動重試：**

- 你離開或切換 Minecraft 伺服器（重試排程會清除，舊伺服器遲來的回應也會忽略）
- 明確停止語音
- 連線因為遭到取代、退出、頻率／政策拒絕或不支援的訊息而關閉（關閉代碼 4000/4003/4008/1008/1003）

舊權杖絕不重複使用；伺服器若未確認有執行 SocketSVC，用戶端也絕不會盲目重新連線。重試停止後，可以執行 `/ssvc reconnect` 手動重新開始。暫時性錯誤與權杖遭拒（4001）則會自動重試。

## 麥克風斷線時 [#when-your-microphone-disconnects]

拔掉耳麥、USB 麥克風重設或藍牙耳機斷訊，都不會中斷語音。用戶端會自行重新開啟麥克風，不必回到設定重新選擇。

| 情況 | 會發生什麼 |
| --- | --- |
| 麥克風馬上就恢復（短暫重設） | 約半秒內恢復收音，聊天室不會顯示訊息 |
| 你選擇的麥克風不見了，但還有其他麥克風 | 改用系統預設麥克風，並在聊天室告知 |
| 完全沒有麥克風 | 用戶端會持續重試（最多每幾秒一次），並在聊天室告知一次 |
| 你選擇的麥克風重新插回 | 幾秒內自動切換回來，並在聊天室告知麥克風已恢復 |
| 麥克風仍連接著，但不再傳送音訊 | 連續 3 秒沒有音訊就視為斷線，並重新開啟 |

能不能切換回原本的麥克風，要看裝置重新連接後系統是否再次回報。如果麥克風沒有自動恢復，請在 **裝置** 中重新選擇，這樣一定會重新開啟。

## 手動重新連線與狀態 [#manual-reconnect-and-status]

| 指令 | 用途 |
| --- | --- |
| `/ssvc status` | 顯示連線狀態、靜音／停止接收語音、麥克風 RMS 音量與門檻、本次工作階段已傳送的幀數，以及輸入／輸出裝置 |
| `/ssvc reconnect` | 不必離開 Minecraft 就能申請新權杖；伺服器須為新版，最多每 5 秒執行一次 |

詳情請參閱 [操作方式](/client/controls)。

## 錯誤訊息 [#error-messages]

| 訊息 | 意義 |
| --- | --- |
| 語音伺服器網址無效，請管理員檢查 public-url。 | 伺服器傳來的語音網址格式錯誤，須由伺服器管理員修正 `public-url` |
| 語音授權已過期或遭拒絕，輸入 /ssvc reconnect 取得新授權。 | 權杖已過期或遭拒絕 |
| 無法連上語音，輸入 /ssvc reconnect 重試。 | 連不上語音監聽器 |
| 無法啟動語音連線，請檢查伺服器網址並輸入 /ssvc reconnect。 | 開啟連線失敗 |
| 語音連線逾時，輸入 /ssvc reconnect 重試。 | 連線沒有在時限內完成 |
| 語音已斷線（原因），輸入 /ssvc reconnect 重試。 | 連線中斷，括號內是原因 |
| 收到無效的語音連線資料，請管理員檢查 SocketSVC。 | 交握資料格式錯誤，通常是伺服器的版本或設定問題 |
| 無法使用麥克風，請重新開啟輸入裝置。 | 麥克風已拔除或無法開啟；請到「一般設定」分頁重新選擇麥克風 |
| 自訂取樣沒有聲音、有雜音，或顯示「無法讀取」 | 舊版會誤讀 24 位元與 32 位元的 WAV，還可能把 WAV 交給 MP3 解碼器處理，這兩個問題都已修正。如果仍有問題，可能是檔名沒有對應到任何鼓；「鼓組音色」設定會列出哪些鼓改用內建音色、哪些檔案沒有用到，以及原因 |
| 無法使用樂器：...line with format PCM_SIGNED... not supported | SocketSVC 試過的錄音格式，裝置全都拒絕。通常是其他程式正在使用這個裝置，最常見的是 DAW 獨佔了錄音介面，請先把它關閉。訊息裡附有裝置自己回報的原因，那才是值得細看的部分 |

自動重新連線期間，提到 `/ssvc reconnect` 的錯誤通常會自行恢復。

## 常見問題 [#common-problems]

| 症狀 | 優先檢查 |
| --- | --- |
| 在遊戲中但沒有語音 | `/ssvc status`、伺服器狀態、基礎網址、監聽器是否可連線、代理伺服器協商、首次使用設定與靜音狀態 |
| 首次使用設定期間沒人聽得到我 | 按下「開始使用」關閉設定之前，不會傳送任何麥克風音訊 |
| 在本機可以用，但其他電腦的玩家連不上 | 請伺服器管理員確認 `public-host`/`public-url` 是玩家連得到的位址，而不是 `localhost`（請參閱 [架設伺服器](/server)） |
| 音訊測試都通過，但實際通話聽起來不對 | 檢查裝置路由與收音／播放設定，並實際找兩位玩家測試；合成測試無法涵蓋所有聲學情況 |
| 其他人聽到自己的回音 | 確認「進階設定」→「迴音消除」已開啟（升級時會保留舊版儲存的「關閉」）；遇到難搞的裝置，可以關閉「自動偵測迴音延遲」改為手動設定。戴耳機是最可靠的解法 |
| 說話的開頭或結尾會斷掉 | 使用「按鍵說話」，或將「語音偵測」設為「手動」並調低門檻 |
| 別人聽得到背景噪音或遊戲聲音 | 開啟「雜訊抑制」；在支援的平台上可下載「進階雜訊消除」模型 |
| 玩家音量顯示「等待玩家名單；舊版伺服器不支援此功能。」 | 伺服器版本太舊；語音仍可使用，只是沒有玩家名單。請把用戶端和伺服器都更新 |
| 名牌上從不顯示停止接收語音的圖示 | 用戶端和伺服器都要更新，才會同步停止接收語音的狀態 |
| 分辨不出聲音在前方還是後方 | 使用立體聲耳機，並停用其他環繞音效處理；定位只分水平方向，請參閱 [耳機空間音訊](/client/settings#headphone-spatial-audio) |
| 「進階雜訊消除」顯示「此平台不支援」 | 只支援 Windows x64、Linux x64 與 macOS Apple Silicon；其他平台使用 RNNoise |
| 「進階雜訊消除」模型下載失敗 | 點一下即可重試；下載期間與失敗後會改用 RNNoise |
| 語音連上時遊戲當機，`hs_err_pid` 記錄檔寫著 `socketsvc-mic-capture` 執行緒在 `msvcp140.dll` 發生 `EXCEPTION_ACCESS_VIOLATION` | 只發生在 Windows：你的 Java 內附的 Microsoft C++ 執行階段比「進階雜訊消除」模型（ONNX Runtime）需要的舊，會直接讓遊戲當機而不是失敗。請關閉「進階雜訊消除」。更新後的用戶端會自動偵測，改用預設的雜訊抑制，並顯示「因舊版 Windows 執行階段被封鎖」。若仍想使用這個模型，請改用較新的 Java 21 版本；如果舊檔是 Windows 本身的，則安裝最新的 Microsoft Visual C++ 可轉散發套件 |
| 標題畫面出現「偵測到其他語音聊天模組」 | 同時裝了 Simple Voice Chat 或 Plasmo Voice。兩個都可以保留，在沒有 SocketSVC 的伺服器上 SocketSVC 會自動讓開（請參閱 [相容性](/client/compatibility#running-alongside-another-voice-chat-mod)） |
| 看不到 SocketSVC 圖示、按鍵沒反應 | Simple Voice Chat 或 Plasmo Voice 已連上這台伺服器，而伺服器沒有 SocketSVC，所以 SocketSVC 自動讓開。這是正常的 |
| 看不到 Simple Voice Chat 或 Plasmo Voice 圖示、按鍵沒反應 | 那個模組沒有連上，所以 SocketSVC 把它的按鍵關掉。如果伺服器確實有裝它，代表它連線失敗，請從模組清單開啟它的設定畫面 |
| 按 <kbd>V</kbd> 打不開 Simple Voice Chat 或 Plasmo Voice 選單 | Minecraft 把重複的按鍵交給了 SocketSVC，請在「控制」設定中改掉其中一個（請參閱 [相容性](/client/compatibility#limits)） |
| 把世界開放給區域網路，但訪客沒有語音 | 訪客要安裝符合自己載入器的 SocketSVC 用戶端模組，而且必須開啟 **進階設定 → 區域網路主持 → 在區域網路主持語音聊天**；請參閱 [區域網路與單人遊戲](/client/lan) |
| 聊天室說正在使用系統預設麥克風 | 你選擇的麥克風已拔除或無法使用；恢復後會自動切換回去，請參閱 [麥克風斷線時](#when-your-microphone-disconnects) |
| 音效板顯示「此伺服器尚未支援音效板頻道…」 | 伺服器版本太舊；音效會走你的麥克風頻道，無法同時播放 |
| 其他人聽不到我的音效板 | 伺服器可能設定了 `soundboard-enabled: false`，或拒絕了你的 `socketsvc.soundboard` 權限；此外，停止接收語音的玩家本來就聽不到 |
| 網址下載顯示無法自動下載 ffmpeg | macOS 請自行安裝 ffmpeg（例如 `brew install ffmpeg`）並重新啟動遊戲 |
| 在沒有 SocketSVC 的伺服器上顯示斷線圖示 | 正常：沒有東西可以連線。按 <kbd>H</kbd> 可隱藏 HUD |
| 在沒有 SocketSVC 的伺服器上，HUD 顯示「連線中...」 | 現在不應該再發生：要等伺服器宣告 SocketSVC 或送出交握，才會出現「連線中...」。如果還是出現，代表伺服器（或前面的代理伺服器）宣告了 SocketSVC 的頻道卻沒有執行它 |

## 開發者模式 [#developer-mode]

開啟「進階設定」→「診斷」→「開發者模式」後，右上角會顯示本機語音統計資料，每秒更新兩次；這個設定會保留下來：

- 每秒傳送（指已進入 WebSocket 傳送佇列）與接收的封包數，以及本次工作階段的總數
- 本機 TX 丟棄數與百分比
- 播放佇列幀數、音源數、重新緩衝目標、溢出丟棄與延遲修剪
- 已解碼幀數、解碼錯誤與無效封包
- 緩衝區耗盡次數（包含一般說話時的停頓）以及距離上一個音訊封包的時間
- 麥克風 RMS，以及目前是否正在傳送
- 迴音消除狀態（關閉／已鎖定並顯示延遲／未鎖定、學習中或壓低中）
- 協商出的通訊協定版本（v1/v2）、遺失幀、PLC 成功補償的幀，以及過時／重複的幀

解讀這些數值時請注意：

- 「已傳送」只代表封包已進入 WebSocket 傳送佇列，不代表已確認送達。
- 遺失幀是播放／應用層的序號缺口，不是真正的 TCP 網路遺失。疊加畫面看不到端對端延遲，也看不到伺服器的丟棄遙測資料。
- 什麼都沒收到，可能只是附近沒有人在說話。
- 延遲修剪是為了消除緩衝延遲而刻意跳過的幀，不是連線弄丟的幀。數字持續小幅增加，表示音訊一直成批抵達；數字不再增加，表示佇列已穩定在目標值。
- 每次重新嘗試連線時計數器都會歸零；連線失敗後仍會繼續顯示。
- 不會顯示任何權杖、伺服器網址或玩家身分。

回報問題時，也請開啟「詳細記錄」，把連線、音訊與網路的追蹤資訊寫進 `latest.log`。

## 網路延遲與緩衝 [#network-delay-and-buffering]

以下都是用戶端內建的行為，不需要任何設定：

- 播放時會依封包抵達的抖動程度，在 60 到 400 毫秒之間調整起始預緩衝；每位說話者的積壓上限固定為 1 秒（50 幀）。封包抵達出現空檔時，目標值會迅速提高，維持一秒後再每 250 毫秒降低一幀。
- 卡頓後留在佇列裡的延遲會逐步消除。佇列沒辦法自己消化，因為每 20 毫秒抵達一幀、也只播放一幀；所以卡頓後堆積的音訊會以溫和的速度跳過（每 240 毫秒跳過一個 20 毫秒的幀，落後很多時會更快），直到佇列回到目標值。沒有積壓的連線則完全不會修剪。如果你以前經由通道或反向代理伺服器使用語音，一開始正常、但越講越延遲，現在應該會看到改善。
- 樂器的線路輸入在收音端也用同樣的方式消化，所以自己電腦短暫卡頓時，樂器聲不會再一直落後於你的演奏。
- 1–3 幀（最多 60 毫秒）的空缺以 Opus PLC 補償；更長的空缺則會重設解碼器，再從真實音訊接著播放。
- WebSocket 暫時出現背壓時，傳送端每位說話者最多保留 25 個封包，總共最多 256 個；尚未送出的音訊一旦超過 600 毫秒，就會捨棄最舊的封包。

緩衝有限，無法掩蓋任意長的 TCP 卡頓；真正的跨區域連線仍需實際測試。