分享方式:


疑難排解

本頁面會列出干擾 Azure 遠端轉譯的常見問題,以及解決這些問題的方法。

無法連線到伺服器

請確定您的防火牆 (裝置上、路由器內部等) 不會封鎖系統需求中所述的連接埠。

無法載入模型

儘管 blob 設定正確,載入模型 (例如透過 Unity 範本) 仍然失敗,可能是因為並未正確連結 blob 儲存體。 <連結儲存體帳戶>章節中會說明合適的連結方式。 正確連結之後,所做變更可能需要長達 30 分鐘才會生效。

有時候在連結儲存體帳戶期間,不會列出遠端轉譯帳戶。 若要修正此問題,請移至 Azure 入口網站中的 ARR 帳戶,然後在左側的 [設定] 群組下選取 [身分識別]。 請確定狀態設定為 [開啟]Unity 畫面偵錯工具

無法透過 SAS 權杖載入模型

如果用戶端應用程式無法透過有效的 SAS 權杖,從儲存體載入模型,可能是 Blob 儲存體上設定的公用網路存取層級所造成。 只有在透過 [已從所有網路啟用] 選項設定了 ARR 模型時,才能從 SAS 權杖載入 ARR 模型:此螢幕擷取畫面顯示 Blob 儲存體上公用網路存取層級的 Azure 入口網站設定。

如果需要限制為私人端點,則必須連結儲存體帳戶,而且必須透過非 SAS 程式碼路徑載入模型,如這裡所述

錯誤「Disconnected: VideoFormatNotAvailable

檢查您的 GPU 是否支援硬體視訊解碼。 請參閱開發電腦

如果您使用具有兩個 GPU 的筆記型電腦,則可能是預設用於執行作業的 GPU 未提供硬體視訊解碼功能。 若是如此,請嘗試強制您的應用程式使用其他 GPU。 通常可以在 GPU 驅動程式設定中變更使用的 GPU。

擷取工作階段/轉換狀態失敗

太過頻繁地傳送 REST API 命令會導致伺服器節流,最終傳回失敗。 在節流狀況下的 HTTP 狀態碼為 429 (「太多要求」)。 根據經驗法則,後續的呼叫之間應該會有 5-10 秒的延遲。

請注意,這個限制不僅會在直接呼叫時影響 REST API 呼叫,也會影響其 C#/C++ 對應項目,例如 Session.GetPropertiesAsyncSession.RenewAsyncFrontend.GetAssetConversionStatusAsync。 有些函式也會在可放心重試時傳回資訊。 例如,RenderingSessionPropertiesResult.MinimumRetryDelay 指定在嘗試另一次檢查之前需等候的秒數。 可用時,最好使用這類傳回值,因為可讓您盡可能頻繁執行檢查,而不會受到節流。

如果您遇到伺服器端節流,請變更程式碼來降低執行呼叫的頻率。 伺服器會每分鐘重設節流狀態,因此可在一分鐘後安全無虞地重新執行程式碼。

H265 轉碼器無法使用

伺服器為何可能由於 codec not available 錯誤而拒絕連線,有兩個原因。

未安裝 H265 轉碼器:

首先,請務必安裝 HEVC 視訊延伸模組,如系統需求的軟體一節中所述。

如果仍然遇到問題,請確定您的圖形卡支援 H265,而且已安裝最新的圖形驅動程式。 如需特定廠商的系統需求資訊,請參閱開發電腦一節。

已安裝轉碼器,但無法使用:

此問題的原因是 DLL 上的安全性設定不正確。 嘗試觀看以 H265 編碼的影片時,不會出現此問題。 重新安裝轉碼器也無法解決問題。 而是必須執行下列步驟:

  1. 以管理員權限開啟 PowerShell 並執行

    Get-AppxPackage -Name Microsoft.HEVCVideoExtension*
    

    (請注意,顯示 * 是因為某些套件安裝版本的名稱為 HEVCVideoExtensions,與 HEVCVideoExtension 不同)。 該命令應會輸出轉碼器的 InstallLocation,如下所示:

    InstallLocation   : C:\Program Files\WindowsApps\Microsoft.HEVCVideoExtension_1.0.23254.0_x64__5wasdgertewe
    
  2. 在 Windows 檔案總管中開啟資料夾

  3. 您應該會看到 x86x64 子資料夾。 以滑鼠右鍵按一下其中一個資料夾,然後選擇 [屬性]

    1. 選取 [安全性] 索引標籤,並選取 [進階] 設定按鈕
    2. 在 [擁有者] 選取 [變更]
    3. 在文字欄位中輸入管理員
    4. 選取 [檢查名稱] 及 [確定]
  4. 對其他資料夾重複上述步驟

  5. 同時對兩個資料夾中的每個 DLL 檔案重複上述步驟。 總共應該有四個 DLL。

若要確認目前設定是否正確,請針對這四個 DLL 各別執行下列步驟:

  1. 選取 [屬性] > [安全性] > [編輯]
  2. 瀏覽所有群組/使用者清單,並確定每個群組/使用者都有正確的讀取和執行集合 (必須已勾選允許資料行中的核取記號)

影片畫質不佳

影片品質可能會因為網路品質或缺少 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 空間中的位置會描述為 minmax,以公尺為單位。 因此,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 有兩個項目:

Unity 轉譯管線

若要修正,請確定已使用提供的 HybridRenderingPipeline 資產:Unity 資產瀏覽器和 [專案設定] 對話方塊的螢幕擷取畫面。HybridRenderingPipeline 資產會在資產瀏覽器中醒目提示。有一個箭頭從資產指向專案設定中的 UniversalRenderPipelineAsset 欄位。

..如 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),可能會依賴至少部分所要設定的圖層位元。

為了此目的,繫結程式碼可讓您以程式設計的方式變更主要相機的圖層位元遮罩。 具體來說,以下是必要步驟:

  1. 在 Unity 中建立新的圖層,並且不要將該圖層用於轉譯任何本機場景幾何。 在這個範例中,假設圖層名為 “Cam”。
  2. 將此位元遮罩傳遞至 ARR,讓 ARR 在主要相機上設定該位元遮罩:
    RemoteManagerUnity.CameraCullingMask = LayerMask.GetMask("Cam");
    
  3. 設定 Cinemachine 屬性以使用這個新圖層:此螢幕擷取畫面顯示 Cinemachine 中相機設定的 Unity 偵測器面板。

本機型態模式不受這個問題影響,因為在此情況下,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:

  1. 使用 ARR 的預設設定來測試場景 (開啟 Z-fighting 緩和措施)

  2. 透過其 API 停用 Z-fighting 緩和措施

  3. 將相機的接近和遠離平面變更為更近的範圍

  4. 依下一節為場景疑難排解

調查剩餘的 Z-fighting

如果已用盡上述步驟,而且也無法接受剩餘的 Z-fighting,則必須調查導致 Z-fighting 的根本原因。 如 Z-fighting 緩和措施功能頁面所述,有兩大原因會造成 Z-fighting:在深度範圍的遠端減損深度精準度,以及表面在成為共面時交集。 深度精確度的減損是數學上可能發生的結果,只能依照上述的步驟 3 來減輕問題。 共面表面代表存在來源資產出現瑕疵,建議在來源資料中修正。

ARR 具有一項功能,可用來判斷表面是否可能導致 Z-fighting:棋盤式反白顯示。 您也可以用視覺方式判斷造成 Z-fighting 的原因。 以下第一個動畫顯示了遠處深度精確度減損的情形,第二個動畫則示範了幾乎為共面的表面:

動畫顯示距離中遺失深度精確度的範例。 動畫顯示表面幾乎共面的範例。

請將這些範例與您的 Z-fighting 進行比較,藉此判斷根本原因,也可以選擇性地依照以下的逐步工作流程進行:

  1. 將相機放在 Z-fighting 表面上方,直接查看其表面。
  2. 將相機緩慢往後移動,從表面移開。
  3. 如果從頭到尾都可以看到 Z-fighting,則表面完全為共面。
  4. 如果大部分時間都可以看到 Z-fighting,則表面幾乎為共面。
  5. 如果只有在遠處時可以看到 Z-fighting,原因在於深度精確度不足。

有許多不同原因會造成共面的表面:

  • 因為發生錯誤或採用不同的工作流程做法,造成匯出應用程式時有重複的相同物件。

    請針對個別的應用程式和應用程式支援,檢查這些問題。

  • 在使用正面或背面揀選的轉譯器中,會將表面複製並翻轉,如此才能在其中顯示雙面。

    透過模型轉換的匯入,會決定模型的主要單面性。 假設雙面性為預設值。 表面會轉譯成一個窄牆,兩面都有物理上正確的光源。 單面性可以在來源資產中由旗標所隱含,或在模型轉換時明確強制規定。 此外,也可以選擇將單面模式設定為「一般」。

  • 物件會在來源資產中交集。

    物件以部分表面重疊的方式轉換時,也會造成 Z-fighting。 在 ARR 中轉換匯入場景的部分場景樹狀結構,也可能造成這個問題。

  • 製作表面的目的在於接觸,例如牆上的材質或文字。

在原生 C++ 應用程式中使用多階段立體轉譯的圖形成品

在某些情況下,對本機內容使用多階段立體轉譯模式的自訂原生 C++ 應用程式 (在個別階段分別轉譯到左右眼),在呼叫 BlitRemoteFrame 後可能會觸發驅動程式 BUG。 該 BUG 會導致非決定性的點陣化問題,造成本機內容的個別三角形或三角形部分隨機消失。 基於效能考量,總之建議使用更新型的單一階段立體轉譯技術來轉譯本機內容,例如使用 SV_RenderTargetArrayIndex

轉換檔案下載錯誤

因為檔案系統限制,轉換服務可能會在從 blob 儲存體下載檔案時遇到錯誤。 特定失敗案例如下所示。 如需 Windows 檔案系統限制的完整資訊,請參閱命名檔案、路徑和命名空間文件。

衝突路徑和檔案名稱

在 blob 儲存體中,可以建立與同層級項目完全相同名稱的檔案和資料夾。 Windows 檔案系統不允許這樣做。 因此,服務會在這種情況下發出下載錯誤。

路徑長度

Windows 和服務會限制路徑長度。 blob 儲存體中的檔案路徑和檔案名稱不得超過 178 個字元。 以 models/AssetsblobPrefix 為例,其為 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,且不得存取。

下一步