Web Player Controller
Web Player Controller(구 VG Controller)는 고객사의 웹사이트에 iframe으로 삽입된 Kollus 플레이어와 통신하여,
재생 상태를 제어하거나 실시간 이벤트를 수신할 수 있게 해주는 JavaScript 라이브러리입니다.
주요 특징
- 통합 제어: 플레이어 종류와 관계없이 단일 규격으로 제어 가능합니다.
- 독립적 구동: 별도의 외부 라이브러리 의존성 없이 독립적으로 동작합니다.
- 이벤트 기반 구조: 메서드 호출 및 실시간 이벤트 리스너 구조를 지원합니다.
용어 정의
이 문서에서 사용하는 주요 기술 용어와 플레이어 표기에 대한 정의입니다. (참고: Kollus 플레이어 종류)
| 용어 | 설명 |
|---|---|
| 비디오 게이트웨이 | 시청자 요청에 따라 재생 데이터 및 인증 정보를 전달하는 서버 |
| 플레이어 ID | Kollus 플레이어 고유 ID |
| 하드웨어 ID | Windows 환경 등 식별 가능한 값이 존재하는 경우 제공되는 하드웨어 고유 ID |
| HLS Fragment | HLS(HTTP Live Streaming) 프로토콜 기반 재생 시 전체 영상을 분할한 최소 단위의 미디어 세그먼트 파일 |
| v3 | HTML5 Player for PC (Hybrid): Microsoft Edge 또는 Chrome 45 이상에서 암호화 콘텐츠 재생 시 적용되는 하이브리드 HTML5 플레이어 |
| v4 | HTML5 Player for All: 비암호화 콘텐츠 전용 비설치형 HTML5 플레이어 |
| v5 | Web Player: 설치형과 비설치형의 장점을 결합한 차세대 통합 웹 플레이어 |
라이브러리 설치 및 초기화
클라이언트 스크립트를 로드한 후, 제어 대상(iframe)을 지정하여 인스턴스를 생성합니다.
기본 구현 예제
<script src="https://file.kollus.com/vgcontroller/vg-controller-client.latest.min.js"></script>
<script>
window.onload = function () {
try {
var controller = new VgControllerClient({
target_window: document.getElementById('child').contentWindow,
});
// Register event listeners and call methods
} catch (e) {
console.error(e);
}
};
</script>
<body>
<iframe id="child" src="https://v.kr.kollus.com/{MEDIA_CONTENT_KEY}..."></iframe>
</body>
주의사항
- 대상 지정:
target_window속성에는 반드시iframe요소의contentWindow객체를 전달해야 합니다. - 브라우저 호환성: 이 라이브러리는
window.postMessageAPI를 사용하여 통신합니다. 해당 API를 지원하지 않는 브라우저에서는 작동이 제한됩니다. - 다중 플레이어 제어: 페이지 내 여러 개의 플레이어(
iframe)가 존재할 경우, 각iframeID별로 개별 인스턴스를 생성해야 합니다.
예외 코드
초기화 및 통신 과정에서 발생할 수 있는 에러 코드입니다.
| 코드 | 메시지 | 설명 |
|---|---|---|
-1 | * | postMessage 통신 중 발생한 예외 |
-99 | player type is not defined | 플레이어 유형 정보 누락 |
-99 | player type must be one of v2, v3, v4 and flash | 지원하지 않는 플레이어 |
-99 | this browser does not support postMessage | 브라우저에서 postMessage API를 지원하지 않음 |
-99 | listener is not callable | 등록하려는 이벤트 리스너가 유효한 함수가 아님 |
CDN 경로
Web Player Controller는 CDN을 통해 제공됩니다. 버전별 Integrity 속성(Integrity Code)은 CDN 목록을 참고하세요.
최신 버전 자동 적용
<script src="https://file.kollus.com/vgcontroller/vg-controller-client.latest.min.js"></script>
특정 버전 고정
<script src="https://file.kollus.com/vgcontroller/vg-controller-client.1.1.4.min.js"></script>
보안 강화 (SRI 적용)
라이브러리 변조 방지를 위한 SRI(Subresource Integrity) 속성 사용을 권장합니다.
<script src="https://file.kollus.com/vgcontroller/vg-controller-client.1.2.3.min.js"
integrity="sha256-esUCCL4RPYMS8AR+Sl3lNrFa5M+zgpt4Gb77qtz66OY="
crossorigin="anonymous">
</script>
이벤트 리스닝
controller.on() 메서드를 활용하여 플레이어의 상태 변화 및 재생 이벤트를 실시간으로 수신합니다.
리스너 등록 방식
단일 리스너
controller.on('event_name', function(param) {
// Register event listener
});
다중 리스너
controller.on('event_name', function(param) {
// First listener
});
controller.on('event_name', function(param) {
// Second listener
});
// Execute all listeners when the event is fired
메서드 체이닝 (Method Chaining)
연속적인 이벤트 등록을 간결한 코드로 구현할 수 있습니다.
controller.on('event_name_1', function(param) {
// First listener
}).on('event_name_2', function(param) {
// Second listener
});
JavaScript 비동기 환경 특성상, 동일 이벤트에 등록된 여러 리스너 간의 실행 순서는 보장되지 않습니다.
- 권장 사항: 엄격한 실행 순서가 필요한 로직은 하나의 리스너 내부에서 순차적으로 작성하세요.
이벤트 목록
재생 상태 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
loaded | 플레이어 구성 요소의 로딩이 완료된 시점에 발생 | v3, v4, v5 |
ready | 서버로부터 재생 데이터를 수신하여 재생 준비가 완료된 시점에 발생 | v3, v4, v5 |
play | 최초 재생 시작 또는 일시정지 후 재생 재개 시 발생 | v3, v4, v5 |
pause | 일시정지 시 발생 | v3, v4, v5 |
done | 재생 시점이 전체 길이(duration) 끝에 도달했을 때 발생 | v3, v4, v5 |
waiting | 네트워크 환경 영향으로 추가 버퍼링이 필요한 경우, 정상화 전까지 1초 주기로 발생 | v4, v5 |
진행률(Progress) 이벤트
HTML5 브라우저 성능 및 네트워크 환경에 따라 progress 이벤트는 정확히 1초 간격이 아닌 약 0.1~0.5초의 오차가 발생할 수 있습니다.
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
progress | 재생 중 약 1초 간격으로 발생하며 현재 재생 위치 정보 전달 | v3, v4, v5 |
progress 파라미터 상세
| 파라미터 | 타입 | 설명 |
|---|---|---|
percent | integer | 현재 재생 진행률 (0~100) |
position | number | 현재 재생 위치 (sec) |
duration | number | 콘텐츠 전체 길이 (sec) |
controller.on('progress', function(percent, position, duration) {
console.log(percent + '%', position + 'sec');
});
탐색(Seek) 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
seeking | 시청자가 재생 시점 이동을 시작한 시점에 발생 | v4, v5 |
seeked | 재생 시점 이동 작업이 완료된 시점에 발생 | v4, v5 |
seek_start | 재생 시점 이동이 감지된 최초 시점에 발생 | v4, v5 |
음향 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
muted | 음소거 상태(On/Off) 변경 시 발생 | v3, v4, v5 |
volumechange | 음량 수치 변경 시 발생 | v3, v4, v5 |
muted 파라미터 상세
| 파라미터 | 타입 | 설명 |
|---|---|---|
is_muted | boolean |
|
volumechange 파라미터 상세
| 파라미터 | 타입 | 설명 |
|---|---|---|
volume | integer | 변경된 음량 수치 (0~100) |
재생속도(배속) 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
speedchange | 재생속도 변경 시 발생 | v3, v4, v5 |
playbackrateschange | 사용 가능한 배속값 그룹 변경 시 발생 | v3, v4, v5 |
speedchange 파라미터 상세
| 파라미터 | 타입 | 설명 |
|---|---|---|
speed | string | 변경된 배속 (0.5~4) |
화면 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
screenchange | 전체 화면 모드와 일반 모드 간 전환 시 발생 | v3, v4, v5 |
device_orientation_changed | 모바일 화면 방 향(가로/세로) 변경 시 발생 | v4, v5 |
user_active_changed | 사용자 인터랙션에 의한 컨트롤바 활성화/비활성화 상태 변경 시 발생 | v4, v5 |
screenchange 파라미터 상세
| 파라미터 | 타입 | 설명 |
|---|---|---|
screen | string |
|
device_orientation_changed 파라미터 상세
| 파라미터 | 타입 | 설명 |
|---|---|---|
orientation | string |
|
자막 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
subtitle_load_done | 자막 파일 로드가 완료된 시점에 발생 | v3, v4, v5 |
subtitlevisibilitychange | 자막 노출 상태(On/Off) 변경 시 발생 | v3, v4, v5 |
스트리밍 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
hls_manifest_loaded | HLS Manifest 파일 로드 완료 시 발생 | v4, v5 |
dash_manifest_loaded | DASH Manifest 파일 로드 완료 시 발생 | v4, v5 |
bitrate_data_loaded | 비트레이트 데이터 로드 완료 시 발생 (오름차순 정렬) | v4, v5 |
hlsfragchange | HLS Fragment 변경 시 발생 | v4, v5 |
bitrate_data 형식 예시
controller.on('bitrate_data_loaded', function(bitrate_data) {
// bitrate_data format: [{ width: <int>, height: <int>, bitrate: <int> }]
});
기타 이벤트
| 이벤트 | 설명 | 대상 플레이어 |
|---|---|---|
error | 재생 중 시스템 오류 발생 시 호출 | v3, v4, v5 |
html5_video_supported | 브라우저의 HTML5 Video 기능 지원 여부 확인 시 호출 | v3, v4, v5 |
jumpstepchange | 구간 이동(빨리감기/되감기) 시간 단위 변경 시 발생 | v3, v4, v5 |
bookmark_change | 북마크 추가, 업데이트, 삭제 시 발생 | v3 |
next_episode_auto_change | 다음 회차 자동 재생 설정 변경 시 발생 | v3, v4, v5 |
next_episode_requested | 다음 회차 콜백이 요청된 시점에 발생 | v3, v4, v5 |
picture_in_picture_entered | PIP(Picture-in-Picture) 모드 진입 시 발생 | v3, v4, v5 |
picture_in_picture_leaved | PIP 모드 종료 시 발생 | v3, v4, v5 |
chapter_data_change | 챕터 데이터 변경 시 발생 | v5 |
메서드 사용법
Controller 인스턴스를 통해 생성된 객체로 플레이어의 동작을 직접 제어할 수 있습니다.
기본 호출 방식
별도의 인자가 필요 없는 제어 명령은 메서드를 직접 호출합니다.
controller.play();
파라미터 전달 방식
설정값이 필요한 제어 명령은 메서드의 인자로 파라미터를 전달합니다.
controller.set_volume(90);
메서드 목록
이벤트 리스너 메서드
| 메서드 | 설명 | 대상 플레이어 |
|---|---|---|
on(event_name, callback) | 이벤트 리스너 등록
| v3, v4, v5 |
off(event_name) | 특정 이벤트에 등록된 모든 리스너 일괄 제거
| v3, v4, v5 |
재생 메서드
| 메서드 | 설명 | 대상 플레이어 |
|---|---|---|
play([start_at]) | 재생 시작
| v3, v4, v5 |
pause() | 현재 재생 중인 콘텐츠 일시정지 | v3, v4, v5 |
toggle_pip() | PIP(Picture-in-Picture) 모드 활 성화 상태 전환 | v3, v4, v5 |
get_progress() | 현재 재생 정보(percent, position, duration) 반환 | v3, v4, v5 |
탐색(Seek) 메서드
| 메서드 | 설명 | 대상 플레이어 |
|---|---|---|
ff() | 현재 재생 위치에서 set_jumpstep 메서드로 설정된 jumpstep만큼 앞으로 이동 (빨리감기, 기본값: 10초) | v3, v4, v5 |
rw() | 현재 재생 위치에서 set_jumpstep 메서드로 설정된 jumpstep만큼 뒤로 이동 (되감기, 기본값: 10초) | v3, v4, v5 |
set_current_time(time) | 재생 상태를 유지하며 지정한 시점으로 이동
| v3, v4, v5 |
get_current_time() | 현재 재생 위치 반환 | v3, v4, v5 |
set_jumpstep(jumpstep) | ff() 또는 rw() 호출 시 이동할 시간 간격 설정
| v3, v4, v5 |
get_jumpstep() | 현재 설정된 jumpstep 값 반환 | v3, v4, v5 |
set_keyframe_seek_default(is_default) | 키프레임 단위 이 동을 기본값으로 설정
| v2 |
play([start_at])와 set_current_time(time) 비교
play(10): 10초 위치로 이동한 후 즉시 재생 시작set_current_time(10): 10초 위치로 이동하지만, 기존 재생/일시정지 상태 유지
음향 메서드
| 메서드 | 설명 | 대상 플레이어 |
|---|---|---|
set_volume(volume) | 음량 설정
| v3, v4, v5 |
get_volume() | 현재 설정된 음량 수치 반환 | v3, v4, v5 |
mute() | 음소거 상태 전환 (On/Off) | v3, v4, v5 |
화면 메서드
| 메서드 | 설명 | 대상 플레이어 |
|---|---|---|
set_screen() | 전체 화면 모드와 일반 모드 간 전환 (FireFox 브라우저 미지원) | v3, v4, v5 |
get_screen() | 현재 화면 모드 반환
| v3, v4, v5 |
set_fullscreen_element(element) | 전체 화면 전환 시 대상으로 지정할 DOM 요소 설정
| v3, v4, v5 |
enable_fullscreen_button() | 플레이어 UI 내의 전체 화면 전환 버튼 활성화 | v3, v4, v5 |
set_video_visibility(visibility) | 비디오 화면 노출 여부 설정 (오디오 재생은 유지)
| v3, v4, v5 |
get_video_visibility() | 비디오 화면의 현재 노출 상태 반환 | v3, v4, v5 |
set_ratio(type) | 화면 확대 및 비율 방식 설정
| v3, v4, v5 |