# Streaming (Egress) Settings

Streaming Settings 페이지에서 OvenMediaEngine이 제공하는 다양한 Egress Protocol을 관리할 수 있습니다.

## WebRTC/WHIP Streaming 설정하기 | 0.9.0.0+/0.15.1.0+

OvenMediaEngine은 WebRTC를 사용하여 1초 미만의 초저지연 스트리밍을 제공합니다.

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/iSSH4XbUfwasyH96DfyR/webrtc-whip.png" alt=""><figcaption><p>WebRTC Streaming Settings</p></figcaption></figure>

WebRTC Streaming Settings 페이지에서는 각 `Application`에 사용할 WebRTC/WHIP Protocol 정보와 활성화 상태를 확인하고 수정할 수 있습니다.

### Signalling 설정하기

WebRTC에서 `SDP`를 교환하기 위해 `Signalling`이 필요하기 때문에, OvenMediaEngine은 `WebSocket` 기반 Signalling Server가 내장되어 있으며 자체 정의된 Signalling Protocol을 제공합니다. 해당 Settings 페이지에서 사용자는 `Signalling`에 사용할 `Port`를 설정할 수 있습니다.

* `Port`: Server가 HTTP 요청을 수신하기 위해 사용할 `Port`를 설정하는 옵션입니다.
* `TLS Port`: Web Browser와 Server 간에 TLS (Transport Layer Security) Protocol을 사용하여 Data를 암호화합니다. 해당 옵션에 설정된 `Port`를 통해 암호화된 Data가 전송됩니다.
* `Worker Count`: Stream 전송 및 수신에 사용되는 스레드 수를 설정할 수 있는 옵션입니다.

{% hint style="info" %}
Signalling 가이드: <https://docs.ovenmediaengine.com/streaming/webrtc-publishing#signalling>
{% endhint %}

### ICE Candidates 설정하기

Web Browser나 Player에서 WebRTC를 Ingest 할 때, Signalling 단계에서 `Ice Candidate`를 서로 교환하기때문에, OvenMediaEngine은 WebRTC 연결을 위한 ICE를 제공합니다.

* `IceCandidate Ports`: `IceCandidate`에 설정된 Candidate 정보를 WebRTC Peer에게 전달하고 WebRTC Peer는 해당 Candidate와의 통신을 요청하기 위해 사용하는 `IP:Port`를 설정하는 기능입니다.
* `TCP Relay Port`: WebRTC는 기본적으로 UDP에서 작동하는데, OvenMediaEngine은 WebRTC가 TCP에서 동작할 수 있도록 WebRTC/TCP용 TURN Server가 내장되어 있습니다. Player의 TURN Client가 TURN Server에 연결하는 TCP Session을 그대로 사용하여 Stream을 수신하거나 전송할 수 있으며 이때 통신을 위해 사용하는 `IP:Port`를 설정하는 기능입니다.
* `TCP Force`:  WebRTC를 TCP로 전송할 때 `ws[s]://<host>[:port]/<app name>/<stream name>`**`?direction=send&transport=tcp`**&#xC640; 같은 URL 패턴을 사용하는데, 이때 TCP Force 옵션을 `True`로 설정하면 URL 패턴에서 `transport=tcp` 쿼리 문자열을 생략해도 TCP로 동작할 수 있게하는 옵션입니다.
* `Worker Count`: Stream 전송 및 수신에 사용되는 스레드 수를 설정할 수 있는 옵션입니다.

{% hint style="info" %}
ICE 가이드: <https://docs.ovenmediaengine.com/streaming/webrtc-publishing#ice>
{% endhint %}

### WebRTC Publisher 활성화 여부 확인하기

* `Timeout`: ICE *(STUN 요청/응답)* 요청 또는 응답을 기다리는 시간으로 단위는 밀리 초이며, 설정된 시간 동안 요청이나 응답이 없으면 세션이 종료됩니다. 30000으로 기본 설정되어 있습니다.
* `Retransmission`:  WebRTC는 UDP를 사용하여 Media Date를 전송합니다. UDP에서 데이터를 전송할 때 빠른 속도와 높은 효율성을 보장하기 위해 `Handshake` 절차를 생략하고, Over Packet 및 Damaged Packet을 버리도록 설계되어 있습니다. `Retransmission` 옵션을 활성화하여 WebRTC 내 RTCP *(Real-time Transport Control Protocol)*&#xB97C; 활용하여 Packet 손실을 감지하고 손실 등으로 인해 버려진 Packet을 재전송 할 수 있습니다.
  * *<mark style="color:blue;">`Retransmission`</mark><mark style="color:blue;">은 필요한 패킷만을 재전송하므로 전체적인 통신 지연을 줄여 네트워크가 불안정한 환경에서 효과적인 통신을 가능하게하지만, Packet 재전송은 추가적인 네트워크 트래픽을 발생시키므로 네트워크 상태와 트래픽 부하를 고려하여 적절히 관리하는 것이 필요합니다.</mark>*

{% hint style="warning" %}
`Retransmission`옵션은 WebRTC/UDP에서는 유용하지만, WebRTC/TCP에서는 효과적이지 않습니다.
{% endhint %}

* `UDP FEC`: 위 `Retransmission`에서 설명한 것과 같이 UDP를 사용하여 Data를 전송할 때 손실이 발생할 수 있는데, `UDP FEC` 옵션을 활성화하여 Data를 전송하기 전에 오류 수정 코드를 Data에 추가해 전송하는 Forward Error Correction (FEC) 기능을 사용할 수 있습니다. FEC를 통해 수신자 측에서 일부 Data가 손실 및 손상되었더라도 원본 Data로 복구할 수 있습니다.
  * *<mark style="color:blue;">`FEC`</mark><mark style="color:blue;">는오류 수정 코드를 추가하기 때문에 전송해야 할 데이터량이 소폭 증가하지만 Packet 재전송 방식이 아니기 때문에 네트워크 대역폭을 보다 효율적으로 사용할 수 있고, 지연 시간 없이 오류를 바로 수정할 수 있습니다.</mark>*

{% hint style="warning" %}
`UDP FEC` 옵션은 WebRTC/UDP에서는 유용하지만, WebRTC/TCP에서는 효과적이지 않습니다.
{% endhint %}

* `Jitter Buffer`: Audio와 Video가 각기 다른 속도와 조건으로 전송될 때, `Jitter Buffer`를 활용하여 Stream Sync를 맞추는 옵션입니다. 예를 들어, Video Packet이 Audio Packet보다 늦게 도착하면 Audio Packet을 잠시 지연시켜 A/V Stream이 동시에 재생되도록 조정할 수 있습니다.

{% hint style="info" %}
WebRTC Publisher 가이드: <https://docs.ovenmediaengine.com/streaming/webrtc-publishing#publisher>
{% endhint %}

* `Create Default Playlist`: 사용자는 각 재생 프로토콜 (LL-HLS, Legacy HLS, WebRTC)이 기본적으로 생성하는 Playlist (llhls, playlist, webrtc)의 생성 여부를 제어할 수 있습니다. 자세한 가이드는 [#playlist](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#playlist "mention")를 참고하십시오.

{% hint style="info" %}
세부 가이드: <https://docs.ovenmediaengine.com/streaming/webrtc-publishing>
{% endhint %}

## Low-Latency HLS (LLHLS) 설정하기 | 0.14.0.0+

Apple은 확장성을 유지하면서 약 2\~6초 정도의 딜레이로 스트리밍을 가능하게 하는 Low-Latency HLS (LLHLS)를 발표했고, OvenMediaEngine은 0.14.0 이상 버전부터 LLHLS를 사용하여 저지연 스트리밍을 제공합니다.

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/gC4V3BURtHWeNpHgBuxL/image.png" alt=""><figcaption><p>LLHLS Streaming Settings</p></figcaption></figure>

LLHLS Streaming Settings 페이지에서는 각 `Application`에 사용할 LLHLS Protocol 정보와 활성화 상태를 확인하고 수정할 수 있습니다.&#x20;

* `Port`: Server가 HTTP 요청을 수신하기 위해 사용할 `Port`를 설정하는 옵션입니다.
* `TLS Port`: Web Browser와 Server 간에 TLS (Transport Layer Security) Protocol을 사용하여 Data를 암호화합니다. 해당 옵션에 설정된 `Port`를 통해 암호화된 Data가 전송됩니다.
* `Worker Count`: Stream 전송 및 수신에 사용되는 스레드 수를 설정할 수 있는 옵션입니다.

#### LLHLS Publisher 옵션 확인하기:

* `Chunk Duration`: Partial Segment 길이를 소수 단위의 초 (Fractional Seconds)로 설정합니다. `Chunk Duration` 수치는 Low-Latency HLS Player에 영향을 주기 때문에 OME Eneterprise 팀은 0.2초를 권장합니다.
* `Segment Duration`: Segment 길이를 초 단위로 설정합니다. `Segment Duration` 수치가 작을 수록 Stream이 더 빨리 시작되지만 너무 짧으면 Legacy HLS Player가 불안정해질 수 있기 때문에 Apple은 6초를 권장합니다.
* `Segment Count`: Playlist에 나열되는 Segment의 개수를 설정합니다. `Segment Count` 수치는 LLHLS Player에 영향을 미치지 않으므로 Apple이 권장하는 10를 사용하지만, Legacy HLS Player에서 사용할 때는 5를 추천합니다.
  * *<mark style="color:red;">테스트가 아니라면</mark> <mark style="color:red;"></mark><mark style="color:red;">`Segment Count`</mark> <mark style="color:red;"></mark><mark style="color:red;">수치를 3미만으로 설정하지 마십시오.</mark>*
* `Part HoldBack`: 미리 보낼 Segment 길이를 소수 단위의 초 (Fractional Seconds)로 설정합니다.
* `Cross Domain`: `<CorssDomain>`을 통해 Player가 동작하는 도메인을 제어합니다. 자세한 정보는 [여기 (LLHLS Cross Domain)](https://docs.ovenmediaengine.com/streaming/low-latency-hls#crossdomain)를 눌러 살펴보십시오.

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/Q48JyQOa1GCpCd9PVcxm/image.png" alt=""><figcaption></figcaption></figure>

* `Cache Control`: HTTP Response에 `Cache-Control` Header를 추가하여 Edge Server 또는 CDN Cache Server에서 콘텐츠를 Cache에 보관하는 시간을 지정 할 수 있습니다. 자세한 내용은 [#origin-cache](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#origin-cache "mention") 가이드를 참고하십시오.
* `Create Default Playlist`: 사용자는 각 재생 프로토콜 (LL-HLS, Legacy HLS, WebRTC)이 기본적으로 생성하는 Playlist (llhls, playlist, webrtc)의 생성 여부를 제어할 수 있습니다. 자세한 가이드는 [#playlist](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#playlist "mention")를 참고하십시오.
* `Default Query String`: 사용자는 Low-atency HLS (또는 Legacy HLS)의 기본 동작 방식을 `<DefaultQueryString>`을 통해 제어 할 수 있습니다. 자세한 내용은 [#default-query-string](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#default-query-string "mention") 가이드를 참고하십시오.
* `Origin Mode`: 해당 Stream을 Origin으로 지정합니다.
* `Propagate Query String`: 사용자가 `<PropagateQueryString>` 을 활성화하면, 최초 Master Playlist 요청에 포함된 Query String이 하위 모든 요청 (Media Playlist, Segment, Partial Segment)에 자동으로 포함됩니다. 자세한 내용은 [#query-string](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#query-string "mention") 가이드를 참고하십시오.
* `ServerTime Based Segment Numbering:` Origin 이중화 설정을 통해 Edge Server 또는 CDN Cache Server는 Primary Origin Server에 장애가 발생하면 Primary Origin Server 대신 Secondary Origin Server를 연결하여 동일한 콘텐츠를 다운로드 받을 수 있습니다. 자세한 내용은 [#origin](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#origin "mention") 가이드를 참고하십시오.

{% hint style="info" %}
세부 가이드: <https://docs.ovenmediaengine.com/streaming/low-latency-hls>
{% endhint %}

### LLHLS DVR 활성화 여부 확인하기 | 0.14.18.0+

사용자는 `Server.xml`에서 LLHLS Publisher 내 DVR 옵션을 활성화하여 원하는 만큼 긴 Playlist를 만들 수 있습니다. 해당 옵션을 통해 Player가 Live 중에 Stream을 되감아 재생 *(Live Rewind)* 할 수 있습니다.

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/LGsGvTh3VRL9eYbvDLPt/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7(67).png" alt=""><figcaption><p>LLHLS Streaming Settings 내 DVR, DUMP, DRM</p></figcaption></figure>

LLHLS Streaming Settings 페이지 내 DVR 항목을 통해 해당 옵션 정보와 활성화 상태를 확인할 수 있습니다.

* `Storage Path`: 혹여나 너무 긴 Playlist가 생성되어 메모리 과사용 및 과점유를 방지하기 위해Segment를 저장할 경로를 설정합니다.
* `Max Duration`: `Max Duration`에 설정된 시간만큼 Playlist를 저장하며, 단위는 초입니다.

{% hint style="info" %}
LLHLS DVR 가이드: <https://docs.ovenmediaengine.com/streaming/low-latency-hls#live-rewind>
{% endhint %}

### LLHLS DUMP 활성화 여부 확인하기 | 0.14.11.0+

LLHLS Dump는 해당 Stream이 LLHLS로 재생될 때 `.m3u8`과 모든 Track Segment를 Dump하여 Live 중일 때에도 Dump된 지점까지 파일을 VoD에 즉시 제공할 수 있는 기능으로 사용자는 `Server.xml`에서 LLHLS Publisher 내 Dump 옵션을 활성화하여 해당 기능을 사용할 수 있습니다.

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/LGsGvTh3VRL9eYbvDLPt/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7(67).png" alt=""><figcaption><p>LLHLS Streaming Settings 내 DVR, DUMP, DRM</p></figcaption></figure>

LLHLS Streaming Settings 페이지 내 DUMP 항목을 통해 해당 옵션 정보와 활성화 상태를 확인할 수 있습니다.

* `Enable`: LLHLS Dump 기능의 사용 여부를 설정할 수 있습니다.
* `Target Stream Name`: Dump를 진행하고 하는 Stream 명을 기입합니다. 현재 송출중인 Stream 명과 일치하면 Dump를 시작할 수 있습니다. `*`와 `?`를 사용하여 Stream 명을 필터링할 수 있습니다.
* `Playlists`: Target Stream에서 함께 Dump할 Master Playlist를 지정합니다. 해당 Playlist가 Dump할 Stream에 속해있어야 하며, 여러 개의 Playlist를 기입할 수 있습니다.
* `Output Path`: Dump 된 File을 저장할 경로와 File 명을 지정합니다. 사용자는 저장 경로로 지정된 폴더에 대한 쓰기 권한이 있어야 합니다.&#x20;

{% hint style="info" %}
LLHLS Dump 가이드: <https://docs.ovenmediaengine.com/streaming/low-latency-hls#dump>
{% endhint %}

### LLHLS DRM 활성화 여부 확인하기 | 0.16.0.0+

Digital Rights Management (DRM)은 디지털 콘텐츠의 무단 사용, 복제, 배포를 방지하기 위해 사용되는 기술로 OvenMediaEngine 0.16.0 이상 버전부터 간단한 설정을 통해 LLHLS  Stream에 DRM Vendor (`Widevine`,`Fairplay`)를 적용할 수 있습니다.

{% hint style="warning" %}
현재 DRM은 H.264 및 AAC 코덱에서만 지원됩니다. H.265 지원은 곧 추가될 예정입니다.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/aw14MnhhHWvqs00oVnKK/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7(68).png" alt=""><figcaption><p>LLHLS Streaming Settings 내 DRM</p></figcaption></figure>

LLHLS Streaming Settings 페이지 내 DRM 항목을 통해 해당 옵션 정보와 활성화 상태를 확인할 수 있습니다. 또, OvenMediaEngine Enterprise는 DRM Vendor 통합 뿐만 아니라 PallyCon DRM 같은 [상업 DRM Provider 통합](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/advanced-security/digital-rights-management-drm/pallycon-drm-configuration)을 지원합니다.

{% hint style="info" %}
LLHLS DRM 가이드: <https://docs.ovenmediaengine.com/streaming/low-latency-hls#drm-beta>
{% endhint %}

## Legacy HLS (HLSv3 - TS Container) 설정하기 | 0.16.6.0+

MPEG-2 TS 컨테이너 기반 HLS는 이전 기기 지원을 포함하여 여전히 폭 넓은 호환성을 제공하기 때문에 [OvneMediaEngine Enterprise 16.6.0 버전 (2024년 7월 5일 업데이트)](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/about/release-notes/0.16.6#v0.16.6.0-july-5-2024)부터 MPEG-2 TS 컨테이너 기반 HLS 버전 3+를 지원하기로 결정했습니다.

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/sitB21qUCIb6XRiw3ues/image.png" alt=""><figcaption><p>Legacy HLS Streaming Settings</p></figcaption></figure>

Legacy HLS Streaming Settings 페이지에서는 각 `Application`에 사용할 HLS Protocol 정보와 활성화 상태를 확인하고 수정할 수 있습니다.&#x20;

* `Port`: Server가 HTTP 요청을 수신하기 위해 사용할 `Port`를 설정하는 옵션입니다.
* `TLS Port`: Web Browser와 Server 간에 TLS (Transport Layer Security) Protocol을 사용하여 Data를 암호화합니다. 해당 옵션에 설정된 `Port`를 통해 암호화된 Data가 전송됩니다.
* `Worker Count`: Stream 전송 및 수신에 사용되는 스레드 수를 설정할 수 있는 옵션입니다.

{% hint style="info" %}
세부 가이드: <https://docs.ovenmediaengine.com/streaming/hls>
{% endhint %}

#### Legacy HLS Publisher 옵션 확인하기:

<figure><img src="https://content.gitbook.com/content/Z6NWzeQyKbSWkDFSGwGx/blobs/vR1nOmuYASTwMS4icgeb/image.png" alt=""><figcaption></figcaption></figure>

* `Segment Duration`: Segment 길이를 초 단위로 설정합니다. `Segment Duration` 수치가 작을수록 Stream이 더 빨리 시작되지만 너무 짧으면 Legacy HLS Player가 불안정해질 수 있기 때문에 Apple은 6초를 권장합니다.
* `Segment Count`: Playlist에 나열되는 Segment의 개수를 설정합니다. Legacy HLS Player에서 `Segment Count` 수치는 5를 권장합니다.
  * *<mark style="color:red;">테스트가 아니라면</mark> <mark style="color:red;"></mark><mark style="color:red;">`Segment Count`</mark> <mark style="color:red;"></mark><mark style="color:red;">수치를 3미만으로 설정하지 마십시오.</mark>*
* `Cross Domain`: `<CorssDomain>`을 통해 Player가 동작하는 도메인을 제어합니다. 자세한 내용은 [여기 (HLS Cross Domain)](https://docs.ovenmediaengine.com/streaming/hls#crossdomain)를 눌러 참고하십시오.

{% hint style="info" %}
HLS Corss Domain 가이드: <https://docs.ovenmediaengine.com/streaming/hls#crossdomain>
{% endhint %}

* `Create Default Playlist`: 사용자는 각 재생 프로토콜 (LL-HLS, Legacy HLS, WebRTC)이 기본적으로 생성하는 Playlist (llhls, playlist, webrtc)의 생성 여부를 제어할 수 있습니다. 자세한 가이드는 [#playlist](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#playlist "mention")를 참고하십시오.
* `Default Query String`: 사용자는 Low-Latency HLS (또는 Legacy HLS)의 기본 동작 방식을 `<DefaultQueryString>`을 통해 제어할 수 있습니다. 자세한 내용은 [#default-query-string](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#default-query-string "mention") 가이드를 참고하십시오.
* `Origin Mode`: 해당 Stream을 Origin으로 지정합니다.
* `Propagate Query String`: 사용자가 `<PropagateQueryString>` 을 활성화하면, 최초 Master Playlist 요청에 포함된 Query String이 하위 모든 요청 (Media Playlist, Segment, Partial Segment)에 자동으로 포함됩니다. 자세한 내용은 [#query-string](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#query-string "mention") 가이드를 참고하십시오.
* `ServerTime Based Segment Numbering:` Origin 이중화 설정을 통해 Edge Server 또는 CDN Cache Server는 Primary Origin Server에 장애가 발생하면 Primary Origin Server 대신 Secondary Origin Server를 연결하여 동일한 Content를 Download받을 수 있습니다. 자세한 내용은 [#origin](https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/workflow-integration-and-external-system-connectivity/delay-buffer#origin "mention") 가이드를 참고하십시오.

### HLS DVR 활성화 여부 확인하기 | 0.16.0.0+

Legacy HLS Streaming Settings 페이지 내 DVR 항목을 통해 해당 옵션 정보와 활성화 상태를 확인할 수 있습니다.

* `Storage Path`: 혹여나 너무 긴 Playlist가 생성되어 메모리 과사용 및 과점유를 방지하기 위해 Segment를 저장할 경로를 설정합니다.
* `Max Duration`: `Max Duration`에 설정된 시간만큼 Playlist를 저장하며, 단위는 초입니다.

{% hint style="info" %}
HLS DVR 가이드: <https://docs.ovenmediaengine.com/streaming/hls#live-rewind>
{% endhint %}
