This document is about: VOICE 1
SWITCH TO

Photon Voice 1 is the original and first major version of Photon Voice. It is now replaced by Photon Voice 2 which is refactored and enhanced. We highly recommend starting new projects with Photon Voice 2 and if possible migrating existing ones from Photon Voice 1 to Photon Voice 2. Photon Voice will be maintained for the coming months. We will fix important bugs and support new Unity versions but new features will be added only to Photon Voice 2.

Known Issues

在此頁面上,我們將列出各種平台上的Photon的已知問題。
這裡的重點是我們無法修復或進行變通的問題。
在某些情況下,這意味著我們將簡單地列出每個平台的損壞版本,並指導您使用其他版本。

在後台運行

在行動裝置平台上,如果應用程式移動到後台,它會暫停主訊息迴圈,該迴圈負責保持客戶端連接等。

造成這種情況的典型原因是:

  • 玩家按到「主頁按鈕」。
  • 接到電話。
  • 影片廣告。
  • 在應用程式中引入疊加視圖的第三方外掛程式(例如Facebook、Google等)。

在iOS上,應用程式在後台時無法保持連接(請參閱在Apple開發頁面上的後台執行)。當應用程式切換到後台時,斷開客戶端連接可能是有意義的。

在WebGL上,設定PlayerTTL並在重新聚焦分頁時重新連接到遊戲階段也可能是有意義的。
通常,瀏覽器不會在後台運行JS和WebAssembly。在某些情況下,這可以透過在後台播放音訊(甚至是聽不見的音訊)來實現。

如果應用程式暫停的時間超過客戶端斷開連接超時時間(預設為10秒),客戶端將斷開連接,您需要在應用程式「未暫停」後立即重新連接。
只有在應用程式從後台返回後,才會觸發「超時斷開連接」回調。

如果遊戲設計允許玩家在幾秒鐘或幾分鐘後返回,那麼您也可以重新連接並重新加入遊戲。
如果您想在應用程式未暫停時以相同的演員編號重新加入同一房間,您需要考慮以下幾點:

  • PlayerTTL:創建的房間需要具有足夠高的PlayerTTL值,以允許玩家在一段時間後返回。
  • EmptyRoomTTL:創建房間時,需要使用足夠高的EmptyRoomTL值,以便在最後一個加入的玩家的應用程式處於後台時使房間保持活動狀態一段時間。

Unity

匯入時無休止的編譯錯誤

某些Unity編輯器版本創建了不正確的.sln和.csproj檔案。這可能是暫時的。您可以透過「偏好」「外部工具」面板中的按鈕重新生成專案。

您可能希望從Unity套件管理器更新或重新安裝Visual Studio編輯器套件。這也可以解決專案創建問題。

有時,由於舊套件卡在本機離線快取中,資產無法從Assset Store正確更新。
要解決此問題,請先在本機移除Photon資產套件,然後嘗試再次下載和匯入。
此處列出了本機Unity資產存儲快取資料夾的路徑

Socket.SetSocketOption中的ArgumentException

存在已知的Unity問題 這導致IL2CPP組建無法連接到「ArgumentException:值不在預期範圍內。
在System.Net.Sockets.Socket.SetSocketOption」。這是在安裝Windows 10 SDK 10.0.19041.0時發生的。

受影響的Unity版本:2018.4.23f1、2019.4.0f1、2020.1.0b11、2020.2.0a13。更多的Unity小版本也受到了影響。
固定版本為:2020.1.1f1及2019.4.5f1及以上版本。推測是,2018.4.27也是固定的。2018.4.23的解決方法如這裡所述

Unity 2018.2插槽凍結,以.Net 4.x

Unity 2018.2使用了Mono版本,可以凍結通過插槽的通信。根據訊息大小和頻率,這遲早會發生。

最終,2019.2對此進行了修復,2018.3也應該在某個時候進行修復。

當使用Mono和.Net 4.x或.Net標準2.0,我們建議使用2018.4.x或2019.4.x版本。

RunInBackground

Unity的Application.runInBackground在行動裝置平台上不受支援。
相反,每當應用程式在後台來回移動時,都會調用OnApplicationPause方法:

C#

void OnApplicationPause( bool pauseStatus )
{
    if (pauseStatus)
    {
        // app moved to background
    } else
    {
        // app is foreground again
    }
}

IOS App Store提交被拒絕

有時,由於連接問題,Apple團隊會拒絕向App Store提交的內容。
我們試圖與Apple公司解決這個問題,現在這種情況很少見,但仍然可能發生。通常,在這些情況下,UDP會被封鎖。
如果UDP未連接,較新的Photon客戶端可以自動回退到使用TCP。
您必須對拒絕提出上訴,如有疑問,必須要求Apple的開發者支援部門接管。他們的設定通常支援UDP。
請參閱此論壇中的討論以獲取幫助

iOS IPv6

雖然Unity 5.x通常應該支援iOS上的IPv6,但某些版本(如5.4)破壞了這一功能。
一些支援的版本是:4.7.2、5.1.5、5.2.5、5.3.4p4、5.4.0p1和更新版本(請參閱Unity部落格文章)。

UWP / Windows Store功能

如果您的目標是Windows Store (UWP),並且在嘗試連接時出現異常或出現此錯誤:

需要網路功能才能存取網路!

確保從Unity的「玩家設定」 -> 「發佈者設定」 -> 「功能 -> 「InternetClient」啟用所需的功能

Required Capability for Windows Store Apps
Windows Store應用程式所需的功能。如果您使用Photon Voice,您還需要「麥克風」功能。

UWP應用程式與其他應用程式隔離,且作為一項功能,無法連接到在同一Windows執行個體上運行的伺服器。
請參閱Microsoft檔案以了解「AppContainer隔離」。

UWP匯出

如果您想將Unity應用程式匯出到UWP,您可以使用.NET或IL2CPP作為指令碼後端。Photon PUN或Photon Realtime Unity SDK已經設置為選擇正確的程式庫,以便從Unity成功匯出應用程式。但是,如果匯出時出現問題,請檢查並確保您為特定的指令碼後端使用了正確的程式庫:

Photon Voice

Android麥克風許可權

Unity 2018.3中新增了請求Android許可權。 您可以在這裡閱讀相關內容,您可以找到如何請求麥克風許可權的示例。

通常,在為Android平台組建時,Unity會自動將大多數許可權新增到清單檔案中。
Photon Voice需要的兩個許可權是:

  • android.permission.INTERNET:透過Unity的玩家設定自動新增。
  • android.permission.RECORD_AUDIO:使用Unity的麥克風API時自動新增。

然而,由於新引入的許可權模型,Android Marshmallow似乎出現了問題。
生成的APK將缺少android.permission.RECORD_AUDIO許可權,應用程式將無法錄製您的語音。
為了避免此類問題,在針對Android SDK級別23時,請更新到最新的Unity版本。

Unity的預設行為是在應用程式打開後立即請求所有許可權。
您可以透過在「AndroidManifest.xml」檔案中新增一行來停用此功能:

XML

<application <!-- your application's attributes --> >
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
</application>

如果您這樣做,您需要自己申請麥克風許可權。
否則,Photon Voice將無法工作。
您可以使用這個外掛程式

iOS麥克風許可權

您需要在專案的「其他設定」->「設置」部分的「玩家設定」中新增「麥克風使用說明」,如下方畫面截圖所示:

Microphone Usage Description in Player Settings for iOS
iOS的玩家設定中的麥克風使用說明。

或者,您必須在Unity匯出的Xcode專案中的「Info.plist」中新增NSMicrophoneUsageDescription鍵。
字串值應該解釋為什麼您的應用程式使用麥克風。
未能做到的話可能會導致:

  • Apple拒絕該組建提交。
  • 當機。

macOS麥克風許可權

您需要在專案的「其他設定」->「設置」部分的「玩家設定」中新增「麥克風使用說明」。
這可確保將NSMicrophoneUsageDescription新增到macOS應用程式搭售套件Contents中的plist中。
如果願意,您也可以手動修改它。

但是,您可能還需要新增以下許可權:

Plain Old Text

com.apple.security.device.audio-input
com.apple.security.device.microphone

在這裡閱讀更多。

未能完成可能會導致:

  • 當機。
  • 麥克風靜音故障:不會錄製音訊輸入。

Unity麥克風問題

  • 在某些Unity版本上,Microphone.Start()可能會拋出空指標異常或返回0通道。
    後者可能導致以下異常:

    ArgumentOutOfRangeException:必須是單聲道或立體聲

  • 在某些Unity版本上,麥克風片段中報告的取樣速率可能為0。
    有關更多資訊,請查看此Unity問題追蹤器連結

  • 在某些Unity版本中,Windows上的輸入裝置切換中斷:無論您選擇哪種Unity麥克風裝置,都只能使用預設裝置進行錄製。
    有關更多資訊,請查看此Unity問題追蹤器連結

頻率警告

如果您遇到與此類似的警告:

MicWrapper不支援建議的頻率48000(最小:44100,最大:44100)。設定為44100

這意味著由於硬體限制,無法使用取樣速率設定。

本機語音#1音訊源頻率44100和編碼器取樣速率24000不匹配。 重新取樣將在編碼之前進行。

另一個警告是關於重新取樣(理論上影響效能),當麥克風頻率與編碼器頻率不匹配時會發生重新取樣。
盡可能將麥克風頻率設定為與編碼器相同的值是一種很好的做法。

Opus編碼器支援輸入信號的幾個固定頻率。
在創建本機語音時,您應該選擇它們。
用不同頻率的資料饋送本機語音是沒有意義的。
所以,當您設定捕捉裝置時,您為它設定了相同的頻率。
但是,有些裝置不允許任意頻率(例如Android)。
在這種情況下,將設定最接近的可用和支援頻率。

本地程式庫更新

Unity Editor Warning For Native Library Files
Unity編輯器對本地程式庫檔案的警告。

如果在Unity編輯器中處於遊玩模式時使用程式碼載入本地程式庫檔案,則除非關閉編輯器,否則不會卸載。
當您嘗試匯入和更新本地程式庫檔案時,如果後者已載入到記憶體中,Unity編輯器將拋出錯誤(見下方畫面截圖),因為您至少進入了一次遊玩模式。
即使在編輯器仍處於打開狀態時手動刪除它,無論是從編輯器本身內部還是外部進行刪除,問題仍然存在。
因此,在更新Photon Voice時,請確保重新啟動Unity編輯器,並且在執行更新之前不要進入遊玩模式。

Unity Editor Native Library Import Error
Unity編輯器本地程式庫匯入錯誤。

Android 64位元支援

Photon Voice提供從1.18和2.4版本開始的Android 64位元相容程式庫。
最低支援的Unity版本是2017.4 LTS和2018.2。
有關支援Android 64位元的Unity版本和說明的完整清單,請前往此連結

iOS喇叭問題

Unity在iOS(主要是iPhone)上有一個已知的問題,即「聽筒」(裝置正面頂部用於通話的喇叭)被用作預設的音訊輸出裝置,而不是外放喇叭(也稱為內建喇叭)或任何其他插入或連接的耳機、頭戴式耳機或耳機聽筒。

這個問題有時也被稱為「低音量」。

連結到Unity問題追蹤器

為了解決這個問題,我們建議採取以下措施:

  1. 如果您使用的是Photon Voice 1,請升級到Photon Voice 2。
  2. 使用Photon作為Recorder.MicrophoneType
  3. 如果1和2不可能:
    a. 如果您使用Unity 2018.3或更新版本,可以從iOS播放機設定中啟用「錄製時強制iOS喇叭」。
    b. 使用「UnitySpeakerFix」。
  4. 透過Unity編輯器或使用Recorder.SetIosAudioSessionParameters方法透過程式碼調整iOS音訊遊戲階段參數。
    您可以從預設值中選擇值,也可以手動定義自訂值。
    在這裡閱讀iOS音訊遊戲階段資訊。
    使用自訂設定是進階的,應該是最後的手段,因為它需要大量的實驗、測試、試驗和錯誤。
    我們建議使用預設VoIP或遊戲,除非有無法工作的用例,或者有一個經過測試的組合且效果更好。

iOS靜音/響鈴開關和靜音

根據設計,大多數iOS音訊遊戲階段類別在設置時都不允許靜音。
如需更多資訊,請查看此處的表B-1
例如,使用預設音訊遊戲階段類別是「PlayAndRecord」(AVAudioSessionCategoryPlayAndRecord)(透過「遊戲」預設設定),將硬體切換到「靜音」不會使您的應用程式靜音,您也不能將音量降至零。

Oculus OVR SDK

如果您使用Oculus OVR SDK,則需要停用「可以擁有麥克風」。
此選項為Oculus OVR SDK提供了專用麥克風控制,可能會阻止Photon Voice Recorder正確存取麥克風。

您可以在這裡找到它:
「LocalAvatarWithGrab」或「(+)LocalAvatar」GameObject -> 「Ovr虛擬人偶(指令碼)」元件 -> 「可以擁有麥克風」勾選方塊,取消勾選它。

回聲或噪音

首先,始終更新到最新的Photon Voice 2。

可能引起回聲的事情:

  • 使用彼此距離不夠遠的多個裝置進行測試,這樣一個裝置的麥克風輸入就會從另一個的喇叭獲得輸出。
  • 使用偵錯回聲進行測試:Recorder.DebugEchoMode設定為true
  • 在同一台機器上使用多個客戶端進行測試。

減少回聲或噪音的方法:

  • 原生音訊輸入外掛程式:嘗試Photon麥克風類型。
  • 軟體音訊處理(基於WebRTC):嘗試將WebRtcAudioDsp元件連接到與錄音機相同的遊戲物件,啟用AEC/AEC Mobile和NoiseSuppression。

如果透過使用耳機解決了問題,我們建議向您的用戶新增一條訊息(例如在啟動顯示畫面後),其中建議使用耳機,以獲得更好的音訊體驗,就像許多應用程式一樣。

低音量

首先,您需要確定低音量問題是由輸入還是輸出引起的。
您可以使用AudioClip檔案(您知道其響度正常)作為輸入源+DebugEchoMode來執行此操作。
如果是輸出,您需要新增喇叭的音量或修復與輸出音訊裝置相關的任何問題。
如果是輸入,且輸入源是麥克風:

根據您的目標平台,您可以選擇:

  1. 使用Photon麥克風類型。
  2. 在正在使用的錄音器元件旁邊新增WebRtcAudioDsp元件(在編譯時或錄音器啟動前的運行階段),並啟用「AGC」(自動增益控制),然後根據需要調整「AGC壓縮增益」。
  3. 在正在使用的錄音器元件旁邊新增MicAmplifier元件(在編譯時或錄音器啟動前的運行階段),並調整其值。

高音調

雖然本節被命名為「高音調」,因為這是用於描述重複播放問題的最常見關鍵字,但我們也試圖在這裡列出其他播放問題的可能解決方案。我們還分享了一些關於如何調整音樂串流播放延遲設定的技巧。

您偶爾會注意到Photon Voice Speaker 播放中的音調變化幾秒鐘,因為它試圖跟上。

這是我們在音訊播放機(UnityAudioOut)中進行程式碼更改以更好地處理網路延遲變化的結果(這發生在2.20中)。

因此,為了解決這個問題,我們在v2.22中新增了幾個參數值來調整播放延遲。

您可以透過PhotonVoiceNetwork.Instance.SetGlobalPlaybackDelaySettings / VoiceConnection.SetGlobalPlaybackDelaySettings或對各個喇叭單獨設定(speaker.SetPlaybackDelaySettings),來設定高級播放延遲設定(PlaybackDelaySettings)。
這可以透過編輯器或程式碼實現。

播放延遲設定:

  • MinDelaySoft:目標延遲的最低界限:音訊播放機試圖將延遲保持在此值以上。預設值為200。
  • MaxDelaySoft:目標延遲的上限:音訊播放機試圖將延遲保持在此值以下。預設值為400。
  • MaxDelayHard:音訊播放機保證延遲永遠不會超過此值。預設值為1000。

播放行為:

  • 當延遲在MinDelaySoftMaxDelaySoft之間時,什麼也不會發生。
  • 如果它在MaxDelaySoftMaxDelayHard之間,則對資料進行重新取樣以趕上輸入串流。
  • 當延遲 > MaxDelayHard,它只是設定為目標值(MinDelaySoftMaxDelaySoft的平均值,預設值為(200+400)/2=300)。

條件:

  • 0 <= MinDelaySoft
  • MaxDelaySoft > MinDelaySoft
  • 如果MaxDelayHard <= MaxDelaySoft:在這種情況下,不會進行重新取樣。

提示:

想法是調整延遲值,直到找到一個好的折衷方案。

  • 作為第一步,透過設定MaxDelayHard <= MaxDelaySoft來停用播放中的重新取樣。這對於音樂串流尤其重要。
  • 為了避免停頓,請新增延遲,因為罕見的停頓在講話中可能被忽視,在音樂中會被清晰地聽到。
  • 我們建議音樂串流使用更高的MinDelaySoft(500-1000ms,並相應調整MaxDelaySoft)。
  • 另一個值得嘗試的選擇是:可靠的傳輸(透過Recorder.ReliableMode啟用),YouTube以巨大的延遲可靠地傳輸,這就是為什麼它一樣的好。
  • 您可以從預設組合開始:200、400、1000,然後是200、400和400,之後嘗試增加MinDelaySoft,同時保持MaxDelaySoft > MinDelaySoft(雙倍是可以的,即MaxDelaySoft=2*MinDelaySoft)。該步長可以是100毫秒或200毫秒,甚至一次加倍,例如(200、400、400)->(300、600、600)或(400、800、800)等。

如果問題仍然存在:

  • 您可以嘗試取消注釋//#define USE_ONAUDIOFILTERREAD,看看是否有幫助。這種播放方法透過OnAudioFilterRead回調使用Unity的內建音訊管道,其不支援3D定位。
  • 您還可以製作自己的IAudioOut實作進行播放,並在Speaker中使用它。

使用Photon麥克風類型時的Android音量控制

Android上有四個音量滑塊:

  • 媒體音量:音樂、影片、遊戲、其他媒體
  • 通話音量:通話中對方的音量。
    僅在通話期間可用。
  • 鈴聲音量:電話、通知。
  • 警示音量

根據音訊階段模式,系統會自動選擇將哪個滑塊分配給硬體按鈕。
在這裡閱讀更多資訊。

當使用帶Photon麥克風類型的錄音器時,裝置會切換到語音通話模式,以便能夠使用硬體AEC。
在這種情況下,音量按鈕可調節 通話音量
此音量不影響Unity輸出,Unity輸出由 媒體音量 控制。

更改音量時,您可以嘗試切換到 媒體音量 滑塊。

您還可以將Unity麥克風類型與WebRtcAudioDsp一起使用,它具有AEC、NoiseSuppression、AGC甚至更好的VAD。

Unity Microphone Type - Media Volume Slider
Unity麥克風類型 - 媒體音量滑塊
Unity Microphone Type - Volume Sliders
Unity麥克風類型 - 音量滑塊
Photon Microphone Type - Call Volume Slider
Photon麥克風類型 - 通話音量滑塊
Photon Microphone Type - Volume Sliders
Photon麥克風類型 - 音量滑塊
Back to top