화질 5단계를 미리 만들어 둡니다. 그러면 시청자에게 어느 것을 줄지 정해야 하는데, 그 결정을 서버가 하면 안 됩니다.
판단은 받는 쪽이 한다
서버는 시청자의 네트워크 상태를 모릅니다. 알 수 있는 것은 조금 전에 보낸 것이 얼마나 빨리 갔는지인데, 그것도 서버 쪽에서 보는 값입니다.
받는 쪽은 자기가 실제로 얼마나 빨리 받았는지와 버퍼가 얼마나 남았는지를 압니다. 그래서 다음 조각의 화질을 받는 쪽이 고릅니다.
| 역할 | 하는 일 |
|---|---|
| 서버 | 어떤 화질이 있는지 목록으로 알려준다 |
| 받는 쪽 | 다음 조각을 어느 화질로 받을지 고른다 |
서버가 무상태가 됩니다. 조각 요청은 그냥 파일 요청이고, 누가 어떤 화질을 보고 있는지 기억할 필요가 없습니다. 이것이 엣지에서 그대로 캐시될 수 있는 이유이기도 합니다.
무엇을 보고 고르나
두 신호를 함께 봅니다.
| 신호 | 뜻 |
|---|---|
| 최근에 받은 속도 | 지금 네트워크가 얼마나 되는가 |
| 남은 버퍼 | 실패할 여유가 얼마나 있는가 |
속도만 보면 잘못 판단합니다. 속도가 좋아 보여도 버퍼가 거의 비었으면 높은 화질을 시도할 여유가 없습니다. 반대로 버퍼가 넉넉하면 조금 무리해도 됩니다.
그리고 올릴 때와 내릴 때가 대칭이 아닙니다.
내릴 때는 빠르게 내린다. 끊기는 것을 막아야 한다
올릴 때는 천천히 올린다. 올렸다가 다시 내리면 더 나쁘다
화질이 계속 오르내리면 더 나쁘다
전환 판단을 민감하게 만들면 화질이 자주 바뀝니다. 시청자에게는 한 단계 낮은 화질로 안정된 것보다 나쁩니다. 화면이 계속 흐려지고 선명해지는 것은 눈에 띕니다.
그래서 전환에 여유를 둡니다. 올릴 기준과 내릴 기준을 다르게 두어, 경계 근처에서 왕복하지 않게 합니다. 한 번 바꾼 뒤에는 잠시 유지합니다.
화질 목록에 무엇을 넣나
5단계를 어떻게 벌려 놓을지도 결정입니다.
| 잘못된 배치 | 문제 |
|---|---|
| 단계가 너무 촘촘하다 | 전환해도 체감이 없고 만드는 값만 든다 |
| 단계가 너무 벌어져 있다 | 한 단계 내리면 눈에 띄게 나빠진다 |
그리고 가장 낮은 화질은 아주 느린 네트워크에서도 끊기지 않을 만큼 낮아야 합니다. 그것이 마지막 방어선입니다. 가장 낮은 것으로도 못 받으면 재생이 멈춥니다.