

# IVS 即時串流最佳化
<a name="real-time-streaming-optimization"></a>

為確保您的使用者在使用 IVS 即時串流進行串流和觀看影片時獲得最佳體驗，您可以使用我們目前提供的各種功能，透過多種方式來改善或優化部分體驗。

## 簡介
<a name="real-time-streaming-optimization-intro"></a>

針對使用者的體驗品質進行優化時，請務必考慮他們想要的體驗，這些體驗可能視乎使用者觀看的內容和網路狀況而改變。

在本指南中，我們專注於作為串流*發布者*或串流*訂閱用戶*的使用者，並且考慮了這些使用者所需的動作和體驗。

IVS SDK 可讓您設定串流的最大位元速率、影格速率和解析度。當發布者發生網路擁塞的情況時，SDK 會自動透過降低位元速率、影格速率和解析度的方式來調整和降低視訊品質。在 Android 和 iOS 上，遇到擁塞時，可以選取降級偏好設定。無論您是使用 simulcast 啟用分層編碼還是保留預設組態，依然會出現相同的行為。

## 適應性串流：Simulcast 分層編碼
<a name="real-time-streaming-optimization-adaptive"></a>

只有下列用戶端版本才支援此功能：
+ iOS 和 Android 1.18.0\$1
+ Web 1.12.0\$1

使用 IVS [即時廣播 SDK](broadcast.md) 時，發布者可對多層影片進行編碼，訂閱用戶則會自動調整或變更為最適合其網路的品質。我們將此稱為 *Simulcast 分層編碼*。

Android 和 iOS 以及 Chrome 和 Edge 桌面瀏覽器 (適用於 Windows 和 macOS) 都支援 Simulcast 分層編碼。我們不支援在其他瀏覽器上進行分層編碼。

在下圖中，主持人將傳送三種影片品質 (高、中和低)。IVS 會根據可用的頻寬，將最高品質的影片轉傳給每位觀眾；這可為每位觀眾提供最佳體驗。如果觀眾 1 的網路連線從良好變更為不佳，IVS 會自動開始向觀眾 1 傳送較低品質的影片，因此觀眾 1 可持續不間斷地觀賞串流內容 (儘可能保持最佳品質)。

![\[採用 Simulcast 分層編碼，以根據觀眾的網路連線品質來調整影片品質。\]](http://docs.aws.amazon.com/zh_tw/ivs/latest/RealTimeUserGuide/images/Layered_Encoding_1.png)


### 預設層級、品質和影格率
<a name="real-time-streaming-optimization-default-layers"></a>

針對行動裝置和 Web 使用者提供的預設品質和層級如下：


| 行動裝置 (Android、iOS) | Web (Chrome) | 
| --- | --- | 
| 高層級 (或自訂)： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 高層級 (或自訂)： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 
| 中層：無 (不需要，因為行動裝置上的高層和低層位元速率之間的差異較小) | 中層： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 
| 低層： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 低層： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 

### 分層解析度
<a name="real-time-streaming-optimization-layer-resolution"></a>

中層和低層的解析度會自動從高層縮減，以維持相同的長寬比。

如果中層和低層的解析度太接近高層，則會遭到排除。例如，如果設定的解析度為 320x180，則 SDK 也不會傳送較低的解析度層。

下表顯示不同解析度設定產生的分層解析度。列出的值適用於橫向螢幕，但可以反向套用至縱向螢幕。


| 輸入解析度 | 輸出層解析度：行動裝置 | 輸出層解析度：Web | 
| --- | --- | --- | 
|  720p (1280x720)  |  高 (1280x720) 低 (320x180)  |  高 (1280x720) 中 (640x360) 低 (320x180)  | 
|  540p (960x540)  |  高 (960x540) 低 (320x180)  |  高 (960x540) 低 (320x180)  | 
|  360p (640x360)  |  高 (640x360) 低 (360x180)  |  高 (640x360) 低 (360x180)  | 
|  270p (480x270)  |  高 (480x270)  |  高 (480x270)  | 
|  180p (320x180)  |  高 (320x180)  |  高 (320x180)  | 

對於未對應於上方的自訂輸入解析度，您可以[使用下列工具](https://codepen.io/amazon-ivs/full/ZENQQvo)進行計算。

### 設定 Simulcast 分層編碼 (發布者)
<a name="real-time-streaming-optimization-simulcast"></a>

若要使用 Simulcast 分層編碼，您必須在用戶端上[啟用此功能](#real-time-streaming-optimization-adaptive)。如果啟用此功能，您會看到發布者的上傳頻寬用量增加，觀眾的影片凍結時間可能會減少。

**Android**：

```
// Enable Simulcast
StageVideoConfiguration config = new StageVideoConfiguration();
config.simulcast.setEnabled(true);

ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config);

// Other Stage implementation code
```

**iOS**：

```
// Enable Simulcast
let config = IVSLocalStageStreamVideoConfiguration()
config.simulcast.enabled = true

let cameraStream = IVSLocalStageStream(device: camera, configuration: config)

// Other Stage implementation code
```

**Web**

```
// Enable Simulcast
let cameraStream = new LocalStageStream(cameraDevice, {
   simulcast: { enabled: true }
})

// Other Stage implementation code
```

如需設定個別層的詳細資訊，請參閱每個廣播 SDK 指南中的「設定分層編碼 (發布者)」：[Android](android-publish-subscribe.md#android-layered-encoding-simulcast-configure-publisher)、[iOS](ios-publish-subscribe.md#ios-layered-encoding-simulcast-configure-publisher) 和 [Web](web-publish-subscribe.md#web-layered-encoding-simulcast-configure-publisher)。

### 設定 Simulcast 分層編碼 (訂閱用戶)
<a name="real-time-streaming-optimization-simulcast-subscriber"></a>

若要設定訂閱用戶接收哪些層，請參閱相應即時串流 SDK 指南中的「Simulcast 分層編碼」小節：
+ [Android 廣播 SDK](android-publish-subscribe.md#android-publish-subscribe-layered-encoding-simulcast)
+ [iOS 廣播 SDK](ios-publish-subscribe.md#ios-publish-subscribe-layered-encoding-simulcast)
+ [Web 廣播 SDK](web-publish-subscribe.md#web-publish-subscribe-layered-encoding-simulcast)

可以透過訂閱用戶組態定義 `InitialLayerPreference`。這會決定最初提供的影片品質以及 `preferredLayerForStream`，而後者又決定在影片播放期間選取的層。在進行層變更、調整變更或層選擇時，有事件和串流方法可用來發出通知。

## 串流組態
<a name="real-time-streaming-configurations"></a>

本節將探討您可以對影片和音訊串流做出的其他組態設定。

### 變更影片串流位元速率
<a name="real-time-streaming-changing-bitrate"></a>

若要變更影片串流的位元速率，請使用下列組態範例。

**Android**：

```
StageVideoConfiguration config = new StageVideoConfiguration();

// Update Max Bitrate to 1.5mbps
config.setMaxBitrate(1500000);

ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config);

// Other Stage implementation code
```

**iOS**：

```
let config = IVSLocalStageStreamVideoConfiguration();

// Update Max Bitrate to 1.5mbps
try! config.setMaxBitrate(1500000);

let cameraStream = IVSLocalStageStream(device: camera, configuration: config);

// Other Stage implementation code
```

**Web**

```
let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], {
   // Update Max Bitrate to 1.5mbps or 1500kbps
   maxBitrate: 1500
})

// Other Stage implementation code
```

### 變更影片串流影格率
<a name="real-time-streaming-changing-framerate"></a>

若要變更影片串流的影格率，請使用下列組態範例。

**Android**：

```
StageVideoConfiguration config = new StageVideoConfiguration();

// Update target framerate to 10fps
config.targetFramerate(10);

ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config);

// Other Stage implementation code
```

**iOS**：

```
let config = IVSLocalStageStreamVideoConfiguration();

// Update target framerate to 10fps
try! config.targetFramerate(10);

let cameraStream = IVSLocalStageStream(device: camera, configuration: config);

// Other Stage implementation code
```

**Web**

```
// Note: On web it is also recommended to configure the framerate of your device from userMedia
const camera = await navigator.mediaDevices.getUserMedia({
   video: {
      frameRate: {
         ideal: 10,
         max: 10,
      },
   },
});

let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], {
   // Update Max Framerate to 10fps
   maxFramerate: 10
})
// Other Stage implementation code
```

### 優化音訊位元速率與立體聲支援
<a name="real-time-streaming-optimize-audio-stream"></a>

若要變更音訊串流的位元速率與立體聲設定，請使用下列組太範例。

**Web**

```
// Note: Disable autoGainControl, echoCancellation, and noiseSuppression when enabling stereo.
const camera = await navigator.mediaDevices.getUserMedia({
   audio: {
      autoGainControl: false,
      echoCancellation: false,
      noiseSuppression: false
   },
});

let audioStream = new LocalStageStream(camera.getAudioTracks()[0], {
   // Optional: Update Max Audio Bitrate to 96Kbps. Default is 64Kbps
   maxAudioBitrateKbps: 96,

   // Signal stereo support. Note requires dual channel input source.
   stereo: true
})

// Other Stage implementation code
```

**Android**：

```
StageAudioConfiguration config = new StageAudioConfiguration();

// Update Max Bitrate to 96Kbps. Default is 64Kbps.
config.setMaxBitrate(96000);

AudioLocalStageStream microphoneStream = new AudioLocalStageStream(microphone, config);

// Other Stage implementation code
```

**iOS**：

```
let config = IVSLocalStageStreamConfiguration();

// Update Max Bitrate to 96Kbps. Default is 64Kbps.
try! config.audio.setMaxBitrate(96000);

let microphoneStream = IVSLocalStageStream(device: microphone, config: config);

// Other Stage implementation code
```

### 變更訂閱用戶抖動緩衝區最低延遲
<a name="real-time-streaming-jitter-buffer-min-delay"></a>

若要變更訂閱參與者的抖動緩衝區最低延遲，可以使用自訂 `subscribeConfiguration`。抖動緩衝區會決定播放開始之前要儲存的封包數量。最低延遲代表應儲存最少的資料量。變更最低延遲有助於在面臨封包遺失/連線問題時能更彈性地進行播放。

但是，增加抖動緩衝區大小也會增加播放開始之前的延遲。增加最低延遲可提供更高的彈性，代價是會影響影片播放的時間。請注意，在播放期間增加最低延遲會有類似的影響：播放會短暫暫停，以便填滿抖動緩衝區。

如果需要更多彈性，建議您先從 `MEDIUM` 的最低延遲預設值開始，並在播放開始之前設定訂閱組態。

請注意，只有在參與者為僅訂閱時，才會套用最低延遲。如果參與者自行發布，則不會套用最低延遲。這樣做是為了確保多個發布者可以彼此交談，而不會產生額外的延遲。

下列範例使用 `MEDIUM` 的最低延遲預設值。請參閱 SDK 參考文件，了解所有可能的值。

**Web**

```
const strategy = {  
   subscribeConfiguration: (participant) => {
      return {
         jitterBuffer: {
            minDelay: JitterBufferMinDelay.MEDIUM
         }  
      }

   // ... other strategy functions
}
```

**Android**：

```
@Override
public SubscribeConfiguration subscribeConfigrationForParticipant(@NonNull Stage stage, @NonNull ParticipantInfo participantInfo) {
    SubscribeConfiguration config = new SubscribeConfiguration();

    config.jitterBuffer.setMinDelay(JitterBufferConfiguration.JitterBufferDelay.MEDIUM());

    return config;
}
```

**iOS**：

```
func stage(_ stage: IVSStage, subscribeConfigurationForParticipant participant: IVSParticipantInfo) -> IVSSubscribeConfiguration {
    let config = IVSSubscribeConfiguration()

    try! config.jitterBuffer.setMinDelay(.medium())

    return config
}
```

## 建議的最佳化
<a name="real-time-streaming-optimization-suggested"></a>


| 案例 | 建議 | 
| --- | --- | 
| 文字串流或移動速度緩慢的內容，例如簡報或幻燈片  | 採用 [Simulcast 分層編碼](#real-time-streaming-optimization-adaptive)，或[以較低的影格率設定串流](#real-time-streaming-changing-framerate)。 | 
| 具有動作或大量移動的串流 | 採用 [Simulcast 分層編碼](#real-time-streaming-optimization-adaptive)。 | 
| 具有對話或很少動作的串流  | 採用 [Simulcast 分層編碼](#real-time-streaming-optimization-adaptive)，或選擇純音訊 (請參閱 [Web](web-publish-subscribe.md#web-publish-subscribe-concepts-strategy-participants) 版、[Android](android-publish-subscribe.md#android-publish-subscribe-concepts-strategy-participants) 版和 [iOS](ios-publish-subscribe.md#ios-publish-subscribe-concepts-strategy-participants) 版即時串流廣播 SDK 指南中的「訂閱參與者」)。 | 
| 使用者以有限的資料串流  | 採用 [Simulcast 分層編碼](#real-time-streaming-optimization-adaptive)，或者如果您想要降低所有人的資料使用量，請[設定較低的影格速率](#real-time-streaming-changing-framerate)並[手動降低位元速率](#real-time-streaming-changing-bitrate)。 | 