실시간 스트리밍 방송 서비스 프로젝트를 진행중인데 OBS에서 송출되는 영상과 보여지고 있는 영상의 딜레이가 너무 길었다
배포 전 -> 17초 이상
배포 후 -> 24 ~ 30초 이상
딜레이의 원인
- 네트워크 지연
- 클라우드 환경에서는 데이터가 여러 네트워크 노드를 거치며 전송, 로컬 환경에 비해 더 많은 네트워크 지연이 발생할 수 있다.
- 인코딩 및 트랜스 코딩
- 영상을 인코딩하고 다양한 해상도로 트랜스 코딩하는 과정에서 처리 시간이 발생한다.
- 클라우드 환경에서는 이 과정이 더 복잡해지고, 리소스 제한으로 인해 시간이 더 걸릴 수 있다.
- HLS 프로토콜 자체의 특성
- HLS는 영상을 여러 짧은 영상 세그먼트로 비디오 스트림을 분할한다.
- 클라이언트는 이 세그먼트들을 다운로드하여 재생하는 방식
- 이 방식은 네트워크 상황에 유연하게 대응할 수 있지만, 세그먼트 길이와 버퍼링으로 인해 딜레이가 발생한다.
- 서버 설정
hls_fragment
, hls_playlist_length
설정은 세그먼트 길이와 재생 목록에 있는 세그먼트의 수를 결정한다.
- 이러한 설정에 따라 딜레이가 생길 수 있다.
줄이는 법
- 세그먼트 길이 줄이기
- HLS 세그먼트의 길이를 줄이면 딜레이를 감소시킬 수 있다.
- 너무 짧게 설정하면 네트워크 변동성에 따른 버퍼링이 증가할 수 있다.
- 최적화된 인코딩 설정 사용
- 인코딩 프로세스를 최적화하여 처리 시간을 줄이고, 가능하다면 하드웨어 가속을 사용
-
CDN 사용
-
서버와 클라이언트 최적화
-
로우 레이턴시 HLS(LHLS) 고려
- 최신 스트리밍 기술인 로우 레이턴시 HLS를 사용하면 전통적인 HLS 대비 훨씬 낮은 딜레이로 스트리밍할 수 있다. 이 기술은 세그먼트 전송을 더 효율적으로 처리
-> 모든 환경과 네트워크 조건에서 일관된 결과를 보장하기 어려울 수 있음
우리의 서비스는 Docker로 현재 배포된 상황이고 NginX - rtmp 모듈을 사용중이다.
우리 서비스 상황에서의 해결법
- nginx 설정과 Docker 환경을 최적화하여 스트리밍 성능을 개선할 수 있는 몇 가지 방법
- HLS 세그먼트 설정 조정
- hls_fragment와 hls_playlist_length 값을 조정
- 현재 설정은 각각 2초와 16초로 되어 있는데, 이는 세그먼트의 길이와 재생 목록의 총 길이를 의미
- 세그먼트 길이를 줄이면 딜레이를 감소시킬 수 있지만, 너무 작은 값은 버퍼링 문제를 야기할 수 있음 -> 최적의 값을 찾아야 함.
- 인코딩 프리셋 조정
- preset 값을 superfast에서 ultrafast로 변경
- 인코딩 속도를 높이지만, 비트레이트 대비 화질이 다소 떨어질 수 있으므로, 품질과 딜레이 간의 균형을 고려해야한다.
- 인코딩 해상도와 비트레이트 최적화
- 송출되는 영상의 해상도와 비트레이트를 최적화하여 네트워크 부하를 줄이고 인코딩 시간을 단축할 수 있다.
- obs studio 에서 조정해보았을때, 로컬환경에서는 7초까지 줄여진 것으로 확인된다.
- Docker 환경 최적화
- Docker 컨테이너의 리소스 할당을 조정하여 인코딩 및 스트리밍 성능을 향상시킬 수 있다.
- docker-compose.yml 파일에서 컨테이너에 더 많은 CPU 코어나 메모리를 할당할 수 있습니다.
- 네트워크 최적화
클라우드 환경에서의 네트워크 지연을 최소화하기 위해, 스트리밍 서버의 지리적 위치를 사용자에게 가깝게 선택하거나, CDN을 활용하여 콘텐츠 전송 속도를 개선
로우레이턴시 HLS, 트랜스코딩
- 여러가지 자료들을 조사해봤을때, 더 짧은 지연시간을 제공하는 로우 레이턴시 HLS와, 파일을 압축되지 않은 형식으로 디인코딩하고 다른 형식으로 변환하는 프로세스인 트랜스 코딩으로 지연시간을 해결할 수 있다지만
로우 레이턴시 HLS 자체는 호환성이 뛰어나지 않고(최신기술), 트랜스 코딩과 같이 이루어질경우 서버의 부하, 비용 증가 측면도 고려해야한다.
그렇다면 트랜스 코딩으로 조금이나마 지연시간을 줄여보는 방식은 어떨지 실험해봐야겠다.
지연시간을 줄이기 위해서 했던 방식
- 인코딩 해상도와 비트레이트 최적화
- 결과: obs studio 에서 조정해보았을때, 로컬환경에서는 7초까지 줄여진 것으로 확인된다.
- 트랜스 코딩
-
방식
1) 프레임레이트 조정
- 저해상도 스트림에서 프레임레이트를 낮추어 네트워크 대역폭을 절약할 수 있다.
- 예를 들어, 240p 저해상도 스트림에서 15fps를 유지하는 것은 합리적인 선택
2) 인코딩 프리셋 조정
- 인코딩 시간과 품질 사이의 균형을 찾기 위해 superfast 외에 다른 프리셋(ultrafast 등)을 적용해보기
- 프리셋을 변경하면 인코딩 속도와 결과물의 품질에 영향을 줄 수 있다.
3) 비트레이트 조정
- 클라이언트의 네트워크 환경에 따라 비트레이트를 조정할 수 있다.
- 높은 비트레이트는 품질을 개선하지만, 네트워크 대역폭 요구사항을 증가시킨다.