# Troubleshooting

## 스트리밍이 원활하지 않은 경우

### **1.** OvenMediaEngine에서 Transcoding을 Bypass로 사용하고 있으며, 모든 플레이어에서 스트리밍이 작동하지 않는 경우

WebRTC는 H.264의 B-프레임(b-frame)을 지원하지 않습니다. 하지만 인코더가 B-프레임을 전송하면 플레이어에서 비디오가 끊길 수 있습니다. 이 경우 인코더에서 B-프레임 기능을 비활성화하여 문제를 해결할 수 있습니다. OBS의 경우 아래와 같이 bframes=0 옵션을 설정할 수 있습니다.

![](/files/qM4jXW9a3rQZgxYVaQTq)

또는 OvenMediaEngine에서 인코딩 옵션을 활성화하여 해결할 수도 있습니다.

{% hint style="info" %}
Setting up Transcoding options in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/transcoding-and-processing/transcoding#encodes>
{% endhint %}

### **2.** 일부 플레이어에서 스트리밍이 작동하지 않는 경우

이 경우는 네트워크 성능, 연결 문제 등으로 인해 패킷 손실이 높은 환경에서 UDP로 스트리밍을 시도하고 있을 가능성이 높으며, 스트림 재생 중 끊김 현상이 점점 더 악화될 수 있습니다. 이 문제는 WebRTC/TCP로 재생하도록 설정하여 간단히 해결할 수 있습니다.

Chrome 브라우저에서 패킷 손실을 모니터링하려면 주소창에 '**chrome://webrtc-internals**'를 입력하여 확인할 수 있습니다.

{% hint style="info" %}
Setting up WebRTC over TCP in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/streaming-and-distribution/webrtc-streaming#webrtc-over-tcp>
{% endhint %}

또한 플레이어를 실행 중인 기기의 네트워크 속도가 스트림의 BPS를 수용할 만큼 충분히 빠르지 않은 경우, 스트리밍 중 끊김 현상이 해결되지 않고 결국 연결이 끊어지게 됩니다. 이 경우 네트워크 속도를 높이는 것 외에는 다른 방법이 없습니다.

### **3.** OvenMediaEngine의 오리진(Origin)에서 과도한 CPU/메모리/네트워크 사용으로 인해 스트리밍이 실패하는 경우

오리진 서버가 과도한 CPU/메모리/네트워크를 사용하는 경우, 모든 플레이어에서 스트리밍 중 끊김 현상이 발생할 수 있습니다.

Origin-Edge 구조에서 오리진의 CPU 사용량이 높은 경우, OvenMediaEngine의 트랜스코딩 옵션이 주된 원인일 수 있습니다. 즉, 입력 스트림의 품질을 너무 높게 설정했거나, 출력 스트림이 하드웨어 성능을 크게 초과하도록 설정되었을 수 있습니다. 이 경우 OvenMediaEngine에서 하드웨어 인코더를 활성화하여 문제를 해결할 수 있습니다.

{% hint style="info" %}
Setting up GPU Acceleration in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/transcoding-and-processing/hardware-encoder-support>
{% endhint %}

### **4.** OvenMediaEngine의 엣지(Edge)에서 과도한 CPU/메모리/네트워크 사용으로 인해 스트리밍이 실패하는 경우

엣지 서버가 과도하게 CPU/메모리/네트워크를 사용하는 경우, 해당 엣지에 연결된 플레이어에서 스트리밍 중 끊김 현상이 발생할 수 있습니다. 이 경우 엣지를 확장(expanding Edge) 하여 문제를 해결할 수 있습니다.

### **5.** CPU/메모리/네트워크가 충분하지만 스트리밍이 원활하지 않은 경우

#### 5-1. 특정 스레드가 CPU를 과도하게 사용하는 경우

특정 스레드가 CPU를 과도하게 사용하는 경우 비디오가 원활하게 스트리밍되지 않을 수 있습니다. 이에 대한 자세한 내용은 아래 매뉴얼을 참조해 주십시오.

{% hint style="info" %}
Tuning OvenMediaEngine Performance: <https://docs.enterprise.ovenmediaengine.com/guide/features/operations-and-monitoring/performance-tuning#performance-tuning>
{% endhint %}

#### 5-2. Linux 커널 튜닝

기본적으로 설정된 Linux 커널은 1Gbps 출력을 처리할 수 없으므로, 다음과 같이 설정하십시오:

```
[ec2-user@ip-172-31-56-213 ~]$ cat /etc/sysctl.conf
fs.file-max = 100000
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_max_syn_backlog = 324000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.optmem_max = 40960
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_slow_start_after_idle = 0

[ec2-user@ip-172-31-56-213 ~]$ cat /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
```

#### 5-3. 혼잡 제어(Congestion Control): BBR로 변경

많은 사람들이 사용하는 모바일 환경은 무선 네트워크를 사용합니다. 네트워크 속도는 빠르지만, 반대로 패킷 손실이 높게 발생할 수 있습니다.

Linux에 기본적으로 설정된 혼잡 제어 방식인 CUBIC은 패킷 손실에 따라 TCP 윈도우(TCP Window)를 조정하므로, 이러한 환경에서 안정적인 스트리밍을 제공하는 데 적합하지 않습니다.

![Source: iccrg-bbr-congestion-control-02.pdf (Page 18)](/files/dYy8ngg2DydN0T1BAn8s)

따라서 저희는 Google의 BBR을 사용할 것을 권장합니다. 주로 무선 네트워크를 사용하는 모바일 사용자에게 WebRTC 서비스를 제공하는 경우 이 설정은 더욱 중요합니다. Linux에서 혼잡 제어 방식을 CUBIC에서 BBR로 변경하십시오.

## 플레이어 연결 실패

### **1.** 혼합 콘텐츠(Mixed Contents)로 인한 실패

HTTPS *(HTTP/TLS)* 사이트에서 ws\:// *(Non-TLS)* 로 시작하는 OvenMediaEngine의 WebRTC URL에 접근하려고 하면, 브라우저에 따라 혼합 콘텐츠(mixed content) 문제로 연결이 거부될 수 있습니다.

이 경우 OvenMediaEngine에 인증서를 설치하고 wss\:// *(WebSocket/TLS)* URL로 연결을 시도하여 문제를 해결할 수 있습니다.

{% hint style="info" %}
Setting up TLS Encryption in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/streaming-and-distribution>
{% endhint %}

### **2.** CORS 오류로 인한 실패

2021년 10월부터 대부분의 브라우저에서 [CORS 정책](https://fetch.spec.whatwg.org)을 강화했으며, TLS 사이트가 아닌 경우 다른 도메인에 대한 접근을 요청할 때 CORS 오류가 자주 발생합니다. 이 경우 플레이어를 로드하는 사이트에 인증서를 설치하여 문제를 해결할 수 있습니다.

### **3.** 로그에 "Too many open files" 메시지가 나타나고 플레이어가 연결할 수 없는 경우

OvenMediaEngine 로그에 어느 순간 "**Too many open files**"라는 메시지가 출력된다면, 더 이상 플레이어 연결을 처리할 수 없는 상태일 수 있습니다. 이 경우 다음과 같이 설정하여 문제를 해결할 수 있습니다:

```
[ec2-user@ip-172-31-56-213 ~]$ cat /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
```

## 스트리밍 시도 시 플레이어의 초기 로드 시간이 오래 걸리는 경우

### 1. 키프레임 간격(Keyframe Interval)으로 인한 문제

OvenMediaEngine에서 Transcoding을 Bypass(우회)로 사용하면서 인코더에서 키프레임 간격을 길게 설정한 경우, WebRTC 플레이어는 키프레임이 입력될 때까지 스트리밍을 시작할 수 없습니다.

이 경우 인코더의 키프레임 간격을 1-2초로 설정하여 해결하거나,

<figure><img src="/files/z3mvBeasF61pfcnl4kJk" alt=""><figcaption><p>How to set the keyframe intverval in OBS, which is the most used encoder</p></figcaption></figure>

또는 OvenMediaEngine에서 인코딩 옵션을 활성화하여 해결할 수 있습니다.

{% hint style="info" %}
Setting up Transcoding options in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/transcoding-and-processing/transcoding#encodes>
{% endhint %}

## A/V 싱크가 맞지 않는 경우

### 1. 초기 스트리밍 중 A/V 싱크가 맞지 않다가 점차 맞춰지는 경우

인코더에서 A/V가 균일하게 입력되지 않을 수 있습니다. 안정적인 스트리밍을 위한 정책을 가진 일부 인코더는 예를 들어 오디오를 먼저 보내고 비디오를 아주 나중에 보내거나, 비디오를 먼저 보내고 오디오를 아주 나중에 보내기로 결정하기도 합니다.

OvenMediaEngine은 1초 미만의 지연 시간 스트리밍을 위해 인코더로부터 받은 입력을 있는 그대로 출력합니다. WebRTC 플레이어 역시 받은 입력을 그대로 스트리밍하기 때문에 특정 인코더의 정책으로 인해 초기 재생 시 A/V 싱크가 맞지 않을 수 있습니다.

하지만 플레이어가 타임스탬프(Timestamp)를 기반으로 스트리밍하는 동안 A/V를 동기화하므로 이는 자연스럽게 해결될 수 있습니다. 그럼에도 불구하고 이 과정이 오류처럼 보인다면, OvenMediaEngine에서 JitterBuffer를 활성화하여 해결할 수도 있습니다.

또한 OvenMediaEngine에서 트랜스코더를 사용 중이고 H.264의 B-프레임을 입력하려고 한다고 가정해 보겠습니다. 오디오는 빠르게 인코딩되지만 비디오는 B-프레임으로 인해 디코더에서 버퍼링됩니다. 따라서 각 인코딩 시작 시점에 시간차가 발생하여 A/V 싱크가 어긋날 수 있습니다. 이 경우에도 JitterBuffer를 활성화하면 문제가 해결됩니다.

{% hint style="info" %}
Setting up WebRTC JitterBuffer in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/streaming-and-distribution/webrtc-streaming#publisher>
{% endhint %}

### 2. 시간이 지났음에도 A/V 싱크가 어긋나는 경우

재생 후 일정 시간이 지나도 A/V 싱크가 보정되지 않는 경우가 있을 수 있습니다. 이 문제는 Firefox와 같은 일부 브라우저의 작은 내부 버퍼(small internal buffers) 로 인해 발생하며, A/V 싱크 차이가 너무 크면 플레이어가 보정을 포기하게 만듭니다. 하지만 이 역시 JitterBuffer를 활성화하여 해결할 수 있습니다.

{% hint style="info" %}
Setting up WebRTC JitterBuffer in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/streaming-and-distribution/webrtc-streaming#publisher>
{% endhint %}

그럼에도 불구하고 A/V 싱크가 보정되지 않는다면 원본 비디오 파일의 오류를 의심해봐야 하며, 이는 HLS로 재생하여 확인할 수 있습니다.

단, HLS 스트리밍 시 A/V 싱크가 잘 맞는다면 이는 OvenMediaEngine의 버그입니다. 버그를 발견하시면 언제든지 [OvenMediaEngine GitHub Issues](https://github.com/OvenMediaLabs/OvenMediaEngine/issues)에 신고해 주십시오.

## 오디오가 출력되지 않는 경우

### 1. 인코딩 옵션에 Opus가 설정되지 않은 경우

WebRTC는 오디오 코덱으로 AAC가 아닌 Opus를 지원합니다. RTMP 및 기타 프로토콜은 주로 AAC를 오디오 코덱으로 사용 및 전송하기 때문에 Opus를 설정하지 않았을 수 있지만, WebRTC는 Opus 없이는 오디오를 출력할 수 없습니다. 이는 OvenMediaEngine에서 Opus를 설정하여 해결할 수 있습니다.

{% hint style="info" %}
Setting up Opus Codec in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/transcoding-and-processing/transcoding#audio>
{% endhint %}

## 원하는 비디오 품질이 아닌 경우

### 1. OvenMediaEngine에서 비디오 인코딩이 활성화된 경우

OME에서 비디오 인코딩을 사용 중인 경우 비디오 비트레이트(bitrate)가 낮게 설정되어 있을 수 있습니다. 이 경우 비디오 비트레이트 단위를 높여 비디오 품질을 향상시킬 수 있습니다.

그러나 OvenMediaEngine은 1초 미만의 지연 시간 스트리밍을 위해 가장 빠른 인코딩 옵션을 기본값으로 사용하므로 설정된 비디오 비트레이트만큼 비디오 품질이 좋지 않을 수 있습니다. 이 경우 OvenMediaEngine은 품질을 제어할 수 있는 출력 프로필 사전 설정(output profile preset) 을 제공하므로, 이를 선택하여 해결할 수 있습니다.

{% hint style="info" %}
Choosing an Encoding Preset in OvenMediaEngine: <https://docs.enterprise.ovenmediaengine.com/guide/features/transcoding-and-processing/transcoding#video>
{% endhint %}

### 2. OvenMediaEngine에서 Transcoding을 Bypass로 사용 중인 경우

인코더가 OvenMediaEngine으로 비디오를 낮은 품질로 전송하고 있기 때문이므로, 인코더 설정에서 입력 품질을 높여서 해결할 수 있습니다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/features/operations-and-monitoring/troubleshooting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
