﻿# Microsoft Teams 如何設定 OBS 與 NDI-out 功能進行網路直播

最近參加了好幾場使用 Microsoft Teams 進行的網路直播，我就很好奇他們到底是怎麼做到的，經過一段時間的研究，終於研究出可以成功啟用此功能的方法與步驟。這篇文章我就來說說啟用的過程，以及設定時的注意事項。

### 從 Teams 管理中心啟用 NDI 功能

我光是第一個步驟就卡了好幾週，一直遲遲找不到幫 Teams 啟用 NDI 的方法，明明設定就很簡單，但是我就是無法啟用，我們馬上來看看這個設定的地雷在哪裡。

基本上要在 Teams admin center 啟用 NDI 功能，請參考以下步驟：

1.  開啟 **Teams admin center** 頁面 ( https://admin.teams.microsoft.com/ )
    
2.  開啟 `Meetings` > `Meeting policies`
    
3.  點擊 `Global (Org-wide default)`
    
4.  找到 `Broadcast production with NDI and SDI hardware` 選項，並啟用該選項！(早期的名稱叫做 `Allow NDI Streaming` 但後來改名成 `Local broadcasting` 然後又改名一次)
    
    ![Teams admin center > Meetings > Meeting policies > Local broadcasting](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/b843146519424f097bcc-151669107-d4ef6bd6-2bd8-423b-93b1-77a2f7392f03.png)
    

這裡我修改的是 `Global` 的全域設定，基本上應該會套用到組織中所有人身上，但在我公司設定就是無法生效。過了好幾天之後才發現，原來我公司所有人的 Meeting policy 都不是選擇 `Global (Org-wide default)`，而是選擇較為嚴格的 `RestrictedAnonymousAccess (Direct)` 會議原則 (Meeting policy)，難怪我怎麼設定都無效！

以下示意圖的瀏覽路徑是 `Users` > `Manage users` > `點選使用者` > `Policies`：

![Policies](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/7a867567bdc6be6c2914-151669429-b2f0f5dc-5f3f-4ad2-8d28-bf4d8c8997b4.png)

你要點選如上圖 `Assigned policies` 右邊的 `Edit` 連結，才能將該使用者的 Meeting policy 切換到 `Global (Org-wide default)`

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/7ee1fb60c241d2fef5e0-151669510-c4240da8-f10f-4867-9dc6-2f5d493ffa0a.png)

你可以使用 Windows PowerShell 快速完成上述動作。

1.  安裝 [Teams PowerShell](https://www.powershellgallery.com/packages/MicrosoftTeams/)
    
    ```powershell
    Install-Module MicrosoftTeams
    ```
    
2.  連接 Microsoft Teams
    
    ```powershell
    Import-Module MicrosoftTeams
    
    $credential = Get-Credential
    Connect-MicrosoftTeams -Credential $credential
    ```
    
3.  將使用者快速切換成 `Global` (預設值)
    
    你可以透過以下 Cmdlet 取得所有 Microsoft Teams 的使用者清單
    
    ```powershell
    Get-CsOnlineUser | select UserPrincipalName
    ```
    
    你可以透過以下命令將其中一位使用者的 Meeting Policy 切換回預設的 `Global` 會議原則
    
    ```powershell
    Grant-CsTeamsMeetingPolicy -Identity "will@duotify.onmicrosoft.com" -PolicyName ""
    ```
    
    > 我到現在還是不理解，為何我公司所有人都會預設切換到 `RestrictedAnonymousAccess` 會議原則？
    
4.  將 `Global` (預設值) 啟用 `Local broadcasting` 選項 (即 NDI Streaming 功能)
    
    ```powershell
    Set-CsTeamsMeetingPolicy -Identity Global -AllowNDIStreaming $true
    ```
    
    > 你也可以透過 [New-CsTeamsMeetingPolicy](https://learn.microsoft.com/en-us/powershell/module/skype/new-csteamsmeetingpolicy?view=skype-ps) 來建立新的會議原則，並透過 [Grant-CsTeamsMeetingPolicy](https://learn.microsoft.com/en-us/powershell/module/skype/grant-csteamsmeetingpolicy?view=skype-ps) 授權給使用者。
    

### 從 Teams 桌面版啟用 NDI 功能

當你從 Teams admin center 啟用 NDI 功能後，還要在你的 Teams 桌面版應用程式開啟這個 NDI 設定

1.  點擊 Teams 右上角的 `...` 與 `設定`
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/dfbfb1c550b55f13464a-151670508-cde9050c-ae7c-42d2-b1d6-dec89efaedba.png)
    
2.  切換到 **應用程式權限** (Permissions) 並啟用 **產品功能 > 網路裝置介面 (NDI)** 選項
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/05b5018784d4c0fe5c19-151670622-8b7cfc4d-5360-4ef8-be20-b48003a4ac03.png)
    
    > 注意: 上圖箭頭的地方，若你沒有在 Teams admin center 啟用 NDI 功能，該選項是看不見的！
    

### 從 Teams 會議中透過 NDI 廣播

當你已經啟用 Teams 桌面版應用程式的 NDI 選項，就可以在 Teams 視訊會議中看到 **透過 NDI 廣播** 的功能，如下圖這樣點擊就會開始透過 NDI 廣播出去了！

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/1b06b6a477acf2d374f2-151670756-ebe6fb6d-9b15-4db3-b494-092e9c32d9af.png)

### 設定 OBS 使用 Teams 來賓的 Webcam 視訊

當你的 Teams 會議開始透過 NDI 廣播，你當然要開啟能夠接收 NDI 廣播的本機應用程式，這裡我們使用 [Open Broadcaster Software (OBS)](https://obsproject.com/) 來接收 NDI 來源訊號。

1.  安裝 OBS 與 NDI 支援
    
    安裝 [Open Broadcaster Software (OBS)](https://obsproject.com/) 軟體
    
    安裝 [OBS NDI Plugin](https://github.com/Palakis/obs-ndi/releases)
    
2.  開啟 OBS 並在 Sources 新增一個 `NDI™ Source` 訊號來源
    
    設定一個名稱，例如：**Teams Host** 或 **Teams Guest 1**
    
    設定以下屬性 (Properties)：
    
    -   Source name: 選擇你希望從 Teams 讀取哪一個 NDI™ Source 來源
    -   Bandwidth: 選擇 `Highest`
    -   Sync: 選擇 `Source Timing` (這個設定會同步你的聲音與影像)
    -   勾選 `Allow hardware acceleration` (若有 GPU 才會使用)
    -   Latency Mode: 選擇 `Low`
3.  解決 NDI 訊號會大小跳動的問題
    
    這個步驟至關重要，因為 Teams 在開視訊會議的時候，影像的品質會依據目前的頻寬使用現況動態調整解析度，以確保會議在低頻寬的環境下也能正常進行。簡單來說，Teams 會允許降低視訊的解析度，以確保會議不會因為頻寬而導致畫面或聲音延遲。另一方面，當你在 **分享螢幕** 時，所有人的視訊解析度也會自動降低，因為 Teams 認為這個時刻大部分的人應該會把焦點著重在分享的畫面上。
    
    視訊的解析度忽大忽小會導致一個嚴重的問題，那就是 OBS 收到的 NDI™ Source 的解析度變化，會讓畫面上的來源訊號忽大忽小一直跳動，這會讓你在透過 OBS 直播時相當困擾。還好這個問題是可以透過 `Transform` 來解決這問題，我們只要限制視訊大小在指定的範圍內即可，以下是設定的步驟：
    
    1.  在 `NDI™ Source` 訊號來源按下滑鼠右鍵，點擊 `Transform` > `Edit Transform` 設定 (或按 `Ctrl+E` 快速鍵)
    2.  變更 **Bounding Box Type** 下拉選單到 `Scale to inner bounds` 選項
    3.  按下 `Close` 即可設定完成
    
    > 事實上，任何會發生忽大忽小的視訊來源，都可以用這個技巧進行設定！
    

### 注意事項

1.  Microsoft Teams 透過 `NDI™ Source` 傳過來的 **影像訊號** (Video) 主要是 Webcam 的鏡頭影像，並不包含 **分享桌面** 的訊號！
2.  Microsoft Teams 透過 `NDI™ Source` 傳過來的 **聲音訊號** (Audio) 每一條來源都包含 **所有人** 會議中的聲音，並不包含每位來賓的分軌音源！
3.  使用 Microsoft Teams 搭配 `NDI™ Source` 進行直播，並**不適合**使用來賓分享桌面的方式進行轉播，**桌面分享** (Display Capture) 僅適用於直播主的桌面！
4.  如果 Teams 的來賓原本有 Webcam 影像訊號，但來賓突然斷線的話，其 `NDI™ Source` 的訊號會自動停格在最後一個**關鍵影格** (Key frame)，畫面不會感覺太奇怪。

### 相關連結

-   [Online events with Teams NDI and OBS](https://www.henkboelman.com/blog/online-events-with-teams-ndi-and-obs/)
-   [Broadcasting audio and video from Teams with NDI and SDI technology](https://support.microsoft.com/en-us/office/broadcasting-audio-and-video-from-teams-with-ndi-and-sdi-technology-e91a0adb-96b9-4dca-a2cd-07181276afa3)
-   [Broadcast meeting content](https://learn.microsoft.com/en-us/microsoftteams/use-ndi-in-meetings?WT.mc_id=DT-MVP-4015686)
-   [Manage meeting policies in Teams](https://learn.microsoft.com/en-US/microsoftteams/meeting-policies-in-teams?WT.mc_id=DT-MVP-4015686)
-   [Use NDI® technology in Teams](https://learn.microsoft.com/en-us/microsoftteams/use-ndi-in-meetings?WT.mc_id=DT-MVP-4015686)
-   [Assign policies to users and groups](https://learn.microsoft.com/en-us/microsoftteams/assign-policies-users-and-groups)
-   [Using Powershell to apply Messaging Policies to Teams Users](https://practical365.com/using-powershell-to-apply-messaging-policies-to-teams-users/)
