疑難排解
本頁面會列出干擾 Azure 遠端轉譯的常見問題,以及解決這些問題的方法。
無法連線到伺服器
請確定您的防火牆 (裝置上、路由器內部等) 不會封鎖系統需求中所述的連接埠。
無法載入模型
儘管 blob 設定正確,載入模型 (例如透過 Unity 範本) 仍然失敗,可能是因為並未正確連結 blob 儲存體。 <連結儲存體帳戶>章節中會說明合適的連結方式。 正確連結之後,所做變更可能需要長達 30 分鐘才會生效。
無法將儲存體帳戶連結至 ARR 帳戶
有時候在連結儲存體帳戶期間,不會列出遠端轉譯帳戶。 若要修正此問題,請移至 Azure 入口網站中的 ARR 帳戶,然後在左側的 [設定] 群組下選取 [身分識別]。 請確定狀態設定為 [開啟]。
無法透過 SAS 權杖載入模型
如果用戶端應用程式無法透過有效的 SAS 權杖,從儲存體載入模型,可能是 Blob 儲存體上設定的公用網路存取層級所造成。 只有在透過 [已從所有網路啟用] 選項設定了 ARR 模型時,才能從 SAS 權杖載入 ARR 模型:
如果需要限制為私人端點,則必須連結儲存體帳戶,而且必須透過非 SAS 程式碼路徑載入模型,如這裡所述。
錯誤「Disconnected: VideoFormatNotAvailable
」
檢查您的 GPU 是否支援硬體視訊解碼。 請參閱開發電腦。
如果您使用具有兩個 GPU 的筆記型電腦,則可能是預設用於執行作業的 GPU 未提供硬體視訊解碼功能。 若是如此,請嘗試強制您的應用程式使用其他 GPU。 通常可以在 GPU 驅動程式設定中變更使用的 GPU。
擷取工作階段/轉換狀態失敗
太過頻繁地傳送 REST API 命令會導致伺服器節流,最終傳回失敗。 在節流狀況下的 HTTP 狀態碼為 429 (「太多要求」)。 根據經驗法則,後續的呼叫之間應該會有 5-10 秒的延遲。
請注意,這個限制不僅會在直接呼叫時影響 REST API 呼叫,也會影響其 C#/C++ 對應項目,例如 Session.GetPropertiesAsync
、Session.RenewAsync
或 Frontend.GetAssetConversionStatusAsync
。 有些函式也會在可放心重試時傳回資訊。 例如,RenderingSessionPropertiesResult.MinimumRetryDelay
指定在嘗試另一次檢查之前需等候的秒數。 可用時,最好使用這類傳回值,因為可讓您盡可能頻繁執行檢查,而不會受到節流。
如果您遇到伺服器端節流,請變更程式碼來降低執行呼叫的頻率。 伺服器會每分鐘重設節流狀態,因此可在一分鐘後安全無虞地重新執行程式碼。
H265 轉碼器無法使用
伺服器為何可能由於 codec not available
錯誤而拒絕連線,有兩個原因。
未安裝 H265 轉碼器:
首先,請務必安裝 HEVC 視訊延伸模組,如系統需求的軟體一節中所述。
如果仍然遇到問題,請確定您的圖形卡支援 H265,而且已安裝最新的圖形驅動程式。 如需特定廠商的系統需求資訊,請參閱開發電腦一節。
已安裝轉碼器,但無法使用:
此問題的原因是 DLL 上的安全性設定不正確。 嘗試觀看以 H265 編碼的影片時,不會出現此問題。 重新安裝轉碼器也無法解決問題。 而是必須執行下列步驟:
以管理員權限開啟 PowerShell 並執行
Get-AppxPackage -Name Microsoft.HEVCVideoExtension*
(請注意,顯示 * 是因為某些套件安裝版本的名稱為
HEVCVideoExtensions
,與HEVCVideoExtension
不同)。 該命令應會輸出轉碼器的InstallLocation
,如下所示:InstallLocation : C:\Program Files\WindowsApps\Microsoft.HEVCVideoExtension_1.0.23254.0_x64__5wasdgertewe
在 Windows 檔案總管中開啟資料夾
您應該會看到 x86 和 x64 子資料夾。 以滑鼠右鍵按一下其中一個資料夾,然後選擇 [屬性]
- 選取 [安全性] 索引標籤,並選取 [進階] 設定按鈕
- 在 [擁有者] 選取 [變更]
- 在文字欄位中輸入管理員
- 選取 [檢查名稱] 及 [確定]
對其他資料夾重複上述步驟
同時對兩個資料夾中的每個 DLL 檔案重複上述步驟。 總共應該有四個 DLL。
若要確認目前設定是否正確,請針對這四個 DLL 各別執行下列步驟:
- 選取 [屬性] > [安全性] > [編輯]
- 瀏覽所有群組/使用者清單,並確定每個群組/使用者都有正確的讀取和執行集合 (必須已勾選允許資料行中的核取記號)
影片畫質不佳
影片品質可能會因為網路品質或缺少 H265 視訊轉碼器而受到損害。
以 MRC 錄製的影片不會反映即時體驗的品質
您可以透過混合實境擷取 (MRC),在 HoloLens 上錄製影片。 不過,產生的影片品質會比即時體驗差,原因有兩個:
- 影片的畫面播放速率上限為 30 Hz,而不是 60 Hz。
- 影片影像不會經過延遲階段重新投影處理步驟,因此影片畫質會較為抖動。
這兩者都是錄製技巧的既定限制。
成功載入模型後出現黑色畫面
如果您已連線到轉譯執行階段並成功載入模型,但之後只看到黑色畫面,這可能有幾個不同的原因。
建議您先測試下列項目,再進行更深入的分析:
- 是否已安裝 H265 轉碼器? 雖然應該會回復使用 H264 轉碼器,但已經發現此種回復作業無法正常運作的情況。 請參閱系統需求,以安裝最新的圖形驅動程式。
- 使用 Unity 專案時,請關閉 Unity,刪除暫存的「程式庫」和專案目錄中的 obj 資料夾,然後再次載入/建置專案。 在某些情況下,快取的資料會導致範例無法正常運作,而且並沒有明顯的原因。
如果這兩個步驟沒有幫助,就必須瞭解用戶端是否有收到影片畫面。 如伺服器端效能查詢一章所述,您可以使用程式設計方式查詢。 FrameStatistics struct
有一個成員,指出已收到多少個影片畫面。 如果此數字大於 0,並隨著時間而增加,用戶端就會從伺服器接收到實際的影片畫面。 因此,這一定是用戶端上的問題。
轉換設定中的縮放值不會套用至模型
如果儘管縮放套用為轉換設定的幾何參數一部分,但模型仍會在縮放未變更的情況下顯示在展示或快速入門,這可能是因為範例的內建自動調整功能所致。 也就是說,不論模型的輸入縮放為何,範例都會縮放模型,使其大小完美符合視體。
若是展示,可以在 models.xml 檔案內的模型 Transform
區段中將 MaxSize
指定為零,以停用自動縮放。 此資料驅動方法需要首先透過 XML 載入模型,因為在所有其他情況下,MaxSize
會預設為 1 公尺。 還有一個預設為 0.5公尺的 MinSize
屬性,導致所有較小的模型放大。
如需如何在展示中載入模型的詳細資訊,請參閱展示文件的將 3D 模型資產新增至 ARR 展示一章。
常見的用戶端問題
這個模型超過所選 VM 的限制,尤其是基本項目的最大數目:
請參閱特定的伺服器大小限制。
這個模型不在相機的視體範圍內:
在許多情況下,此模型會正確顯示,但卻位於相機的視體之外。 其中一個常見的原因是所匯出模型是使用十分偏離中央位置的樞紐,因此是由相機的遠裁剪平面來裁剪。 這種方式有助於以程式設計方式查詢模型的周框方塊,並使用 Unity 作為線條方塊將方塊視覺化,或將其值列印到偵錯工具記錄。
此外,轉換流程會產生輸出 JSON 檔案, 與已轉換的模型搭配使用。 若要偵錯模型定位問題,請務必參考 [outputStatistics] 區段中的 boundingBox
項目:
{
...
"outputStatistics": {
...
"boundingBox": {
"min": [
-43.52,
-61.775,
-79.6416
],
"max": [
43.52,
61.775,
79.6416
]
}
}
}
周框方塊在 3D 空間中的位置會描述為 min
和 max
,以公尺為單位。 因此,1000.0 的座標表示其位於原點的 1 公里之外。
此周框方塊可能會有兩個問題,因此看不見幾何:
- 方塊可能十分偏離中央位置,因此物件會因為目前的遠平面裁剪而遭到系統裁剪。 在這種情況下,
boundingBox
值看起來會像這樣:min = [-2000, -5,-5], max = [-1990, 5,5]
,使用 X 軸上的大量位移作為範例。 若要解決這種類型的問題,請啟用模型轉換設定中的recenterToOrigin
選項。 - 方塊可以置中,但範圍可能太大。 這表示雖然相機是從模型的中央啟動,但其幾何會以所有方向裁剪。 在這種情況下,一般
boundingBox
值看起來會像這樣:min = [-1000,-1000,-1000], max = [1000,1000,1000]
。 這類問題的原因通常是單位調整不相符。 若要補償,請在轉換期間調整值,或以正確的單位標記來源模型。 在執行階段載入模型時,調整也可以套用至根節點。
Unity 管線不包含轉譯勾點:
Azure 遠端轉譯會在 Unity 轉譯管線中執行勾點,組合影片的畫面以進行重新投影。 若要確認這些勾點是否存在,請開啟功能表 Window > Analysis > Frame debugger。 請加以啟用,並確定管線中的 HolographicRemotingCallbackPass
有兩個項目:
若要修正,請確定已使用提供的 HybridRenderingPipeline 資產:
..如 Unity 轉譯管線中所詳述。
模型載入後轉譯棋盤格樣式
如果轉譯的影像看起來像這樣:
則轉譯器達到了標準設定大小的多邊形限制。 若要減輕問題,請切換至進階設定大小,或減少可見多邊形的數量。
Unity 中轉譯的影像會上下顛倒
請務必確實遵循 Unity 教學課程:檢視遠端模型。 影像上下顛倒,代表需要 Unity 才能建立螢幕外的轉譯目標。 目前不支援這個行為,而且會對 HoloLens 2 產生龐大的效能影響。
這個問題的原因可能是 MSAA、HDR 或啟用了後置處理。 請確定已選取低品質設定檔,並在 Unity 中設為預設值。 若要這樣做,請移至 [編輯] > [專案設定...]> [品質]。
在 Unity 2020 中使用 OpenXR 外掛程式時,不論是否啟用後置處理,都會有一些 URP (通用轉譯管線) 版本會建立此種額外的螢幕外轉譯目標。 因此,請務必手動將 URP 版本升級到至少 10.5.1 (或更高版本)。 如欲瞭解此升級流程,請參考系統需求中的說明。
使用遠端轉譯 API 的 Unity 程式碼不會進行編譯
針對 Unity 編輯器進行編譯時使用偵錯
將 Unity 解決方案的「組建類型」 切換為偵錯。 在 Unity 編輯器中測試 ARR 時,定義 UNITY_EDITOR
僅適用於「偵錯」組建。 這個設定與用於已部署應用程式的組建類型無關,在該處您應該偏好使用「發行」組建。
編譯 HoloLens 2 的 Unity 範例時失敗
我們在嘗試編譯適用於 HoloLens 2 的 Unity 範例 (快速入門、ShowCaseApp...) 時,看到了假性失敗。 Visual Studio 提出某些檔案無法複製的情形 (雖然檔案存在)。 如果您遇到這個問題:
- 從專案中移除所有暫存 Unity 檔案,然後再試一次。 也就是說,請關閉 Unity,刪除暫存的「程式庫」和專案目錄中的 obj 資料夾,然後再次載入/建置專案。
- 請確定專案位於磁碟上具有合理短路徑的目錄中,因為複製步驟有時似乎會遇到長檔名的問題。
- 如果沒有幫助,可能是因為 MS Sense 受到複製步驟的干擾。 若要設定例外狀況,請從命令列執行此登錄命令 (需要管理員權限):
reg.exe ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection" /v groupIds /t REG_SZ /d "Unity"
Unity 專案的 Arm64 組建失敗,因為遺漏 AudioPluginMsHRTF.dll
在 3.0.1 版中,Arm64 的 AudioPluginMsHRTF.dll
已新增至 Windows Mixed Reality 套件 (com.unity.xr.windowsmr.metro)。 請確定您已透過 Unity 套件管理員安裝 3.0.1 版或更新版本。 從 Unity 功能表列瀏覽至 [Window] > [套件管理員],然後尋找 Windows Mixed Reality 套件。
Unity Cinemachine
外掛程式無法在遠端型態模式中運作
在遠端型態模式中,ARR Unity 繫結程式碼會以隱含的形式建立 Proxy 相機,執行實際的轉譯作業。 在這個情況下,主要相機的揀選遮罩會設定為 0 (「無」),如此會有效地關閉其轉譯作業。 不過,某些使相機運作的協力廠商外掛程式 (例如 Cinemachine
),可能會依賴至少部分所要設定的圖層位元。
為了此目的,繫結程式碼可讓您以程式設計的方式變更主要相機的圖層位元遮罩。 具體來說,以下是必要步驟:
- 在 Unity 中建立新的圖層,並且不要將該圖層用於轉譯任何本機場景幾何。 在這個範例中,假設圖層名為 “Cam”。
- 將此位元遮罩傳遞至 ARR,讓 ARR 在主要相機上設定該位元遮罩:
RemoteManagerUnity.CameraCullingMask = LayerMask.GetMask("Cam");
- 設定
Cinemachine
屬性以使用這個新圖層:
本機型態模式不受這個問題影響,因為在此情況下,ARR 繫結不會將轉譯作業重新導向至內部 Proxy 相機。
原生 C++ 型應用程式不會編譯
UWP 應用程式或 DLL 的「找不到程式庫」錯誤
在 C++ NuGet 套件內有一個 microsoft.azure.remoterendering.Cpp.targets
檔案,該檔案會定義要使用的二進位類別。 若要識別 UWP
,檔案中的條件會檢查 ApplicationType == 'Windows Store'
。 因此必須確定已在專案中設定這個類型。 透過 Visual Studio 的專案精靈建立 UWP 應用程式或 DLL 時,即屬於此種情況。
不穩定的全像投影
如果轉譯的物件看起來與前端同時移動,您可能遇到了延遲階段重新投影 (LSR) 的問題。 如需有關如何處理這類情況的指引,請參閱延遲階段重新投影一節。
全像投影不穩定 (晃動、變形、抖動 或全像投影跳動) 的另一個原因可能是網路連線不佳,特別是網路頻寬不足,或延遲過高。 網路連線品質良好的指標是 效能統計資料 值 ServiceStatistics.VideoFramesReused
。 重複使用的畫面表示需要在用戶端重複使用舊影片畫面的情況 (因為沒有新的影片畫面可用),例如因為封包遺失或網路延遲等的差異。 如果 ServiceStatistics.VideoFramesReused
經常大於零,這就表示網路有問題。
另一個要查看的值是 ServiceStatistics.LatencyPoseToReceiveAvg
。 此值應始終低於 100 毫秒。 如果看到較高的值,這可能表示您連線的資料中心距離太遠。
如需各種可能降低風險方式的清單,請參閱網路連線指導方針。
與不使用 ARR 的情況相比,HoloLens 2 上的本機內容 (UI 等) 在轉譯時出現失真成品的機率大幅提升
出現這樣的結果是因為預設設定為犧牲本機內容投影品質,換取執行階段的效能。 請參閱說明重新投影型態模式的章節,瞭解如何變更投影模式,以便轉譯出高品質的本機內容,如同不使用 ARR 時的重新投影品質等級。
Z-fighting
雖然 ARR 提供 Z-fighting 緩和措施功能,但 Z-fighting 仍會在場景中顯示。 本指南旨在為這些剩餘問題疑難排解。
建議的步驟
可使用下列工作流程來緩解 Z-fighting:
使用 ARR 的預設設定來測試場景 (開啟 Z-fighting 緩和措施)
透過其 API 停用 Z-fighting 緩和措施
將相機的接近和遠離平面變更為更近的範圍
依下一節為場景疑難排解
調查剩餘的 Z-fighting
如果已用盡上述步驟,而且也無法接受剩餘的 Z-fighting,則必須調查導致 Z-fighting 的根本原因。 如 Z-fighting 緩和措施功能頁面所述,有兩大原因會造成 Z-fighting:在深度範圍的遠端減損深度精準度,以及表面在成為共面時交集。 深度精確度的減損是數學上可能發生的結果,只能依照上述的步驟 3 來減輕問題。 共面表面代表存在來源資產出現瑕疵,建議在來源資料中修正。
ARR 具有一項功能,可用來判斷表面是否可能導致 Z-fighting:棋盤式反白顯示。 您也可以用視覺方式判斷造成 Z-fighting 的原因。 以下第一個動畫顯示了遠處深度精確度減損的情形,第二個動畫則示範了幾乎為共面的表面:
請將這些範例與您的 Z-fighting 進行比較,藉此判斷根本原因,也可以選擇性地依照以下的逐步工作流程進行:
- 將相機放在 Z-fighting 表面上方,直接查看其表面。
- 將相機緩慢往後移動,從表面移開。
- 如果從頭到尾都可以看到 Z-fighting,則表面完全為共面。
- 如果大部分時間都可以看到 Z-fighting,則表面幾乎為共面。
- 如果只有在遠處時可以看到 Z-fighting,原因在於深度精確度不足。
有許多不同原因會造成共面的表面:
因為發生錯誤或採用不同的工作流程做法,造成匯出應用程式時有重複的相同物件。
請針對個別的應用程式和應用程式支援,檢查這些問題。
在使用正面或背面揀選的轉譯器中,會將表面複製並翻轉,如此才能在其中顯示雙面。
透過模型轉換的匯入,會決定模型的主要單面性。 假設雙面性為預設值。 表面會轉譯成一個窄牆,兩面都有物理上正確的光源。 單面性可以在來源資產中由旗標所隱含,或在模型轉換時明確強制規定。 此外,也可以選擇將單面模式設定為「一般」。
物件會在來源資產中交集。
物件以部分表面重疊的方式轉換時,也會造成 Z-fighting。 在 ARR 中轉換匯入場景的部分場景樹狀結構,也可能造成這個問題。
製作表面的目的在於接觸,例如牆上的材質或文字。
在原生 C++ 應用程式中使用多階段立體轉譯的圖形成品
在某些情況下,對本機內容使用多階段立體轉譯模式的自訂原生 C++ 應用程式 (在個別階段分別轉譯到左右眼),在呼叫 BlitRemoteFrame 後可能會觸發驅動程式 BUG。 該 BUG 會導致非決定性的點陣化問題,造成本機內容的個別三角形或三角形部分隨機消失。 基於效能考量,總之建議使用更新型的單一階段立體轉譯技術來轉譯本機內容,例如使用 SV_RenderTargetArrayIndex。
轉換檔案下載錯誤
因為檔案系統限制,轉換服務可能會在從 blob 儲存體下載檔案時遇到錯誤。 特定失敗案例如下所示。 如需 Windows 檔案系統限制的完整資訊,請參閱命名檔案、路徑和命名空間文件。
衝突路徑和檔案名稱
在 blob 儲存體中,可以建立與同層級項目完全相同名稱的檔案和資料夾。 Windows 檔案系統不允許這樣做。 因此,服務會在這種情況下發出下載錯誤。
路徑長度
Windows 和服務會限制路徑長度。 blob 儲存體中的檔案路徑和檔案名稱不得超過 178 個字元。 以 models/Assets
的 blobPrefix
為例,其為 13 個字元:
models/Assets/<any file or folder path greater than 164 characters will fail the conversion>
轉換服務會下載 blobPrefix
底下指定的所有檔案,而不僅是轉換中所使用的檔案。 在這些情況下,造成問題的檔案/資料夾可能不太明顯,因此請務必檢查 blobPrefix
下儲存體帳戶中包含的所有項目。 如需查看下載內容,請參閱下方的輸入範例。
{
"settings": {
"inputLocation": {
"storageContainerUri": "https://contosostorage01.blob.core.windows.net/arrInput",
"blobPrefix": "models/Assets",
"relativeInputAssetPath": "myAsset.fbx"
...
}
}
}
models
├───Assets
│ │ myAsset.fbx <- Asset
│ │
│ └───Textures
│ | myTexture.png <- Used in conversion
│ |
| └───MyFiles
| myOtherFile.txt <- File also downloaded under blobPrefix
|
└───OtherFiles
myReallyLongFileName.txt <- Ignores files not under blobPrefix
HoloLens2「拍照」(MRC) 不會顯示任何本機或遠端內容
如果專案從 WMR 更新為 OpenXR,且專案已存取 HolographicViewConfiguration 類別 (Windows.Graphics.Holographic) 設定,通常會發生這個問題。 OpenXR 中不支援這個 API,且不得存取。