시작하기
-
패키지 설치
Terminal window npm i @capgo/capacitor-youtube-playerTerminal window pnpm add @capgo/capacitor-youtube-playerTerminal window yarn add @capgo/capacitor-youtube-playerTerminal window bun add @capgo/capacitor-youtube-player -
네이티브 프로젝트와 동기화
Terminal window npx cap syncTerminal window pnpm cap syncTerminal window yarn cap syncTerminal window bunx cap sync
기본 사용법
Section titled “기본 사용법”import { YoutubePlayer } from '@capgo/capacitor-youtube-player';
// Initialize the playerconst result = await YoutubePlayer.initialize({ playerId: 'youtube-player', playerSize: { width: 640, height: 360 }, videoId: 'dQw4w9WgXcQ', fullscreen: false, playerVars: { autoplay: 1, controls: 1 }});
// Play videoawait YoutubePlayer.playVideo(result.player);
// Pause videoawait YoutubePlayer.pauseVideo(result.player);
// Listen to player eventsYoutubePlayer.addEventListener(result.player, 'onStateChange', (event) => { console.log('Player state:', event.data);});API 참조
Section titled “API 참조”initialize(options)
Section titled “initialize(options)”YouTube 플레이어 인스턴스를 초기화합니다.
const { player, playerReady } = await YoutubePlayer.initialize({ playerId: 'my-player', playerSize: { width: 1280, height: 720 }, videoId: 'VIDEO_ID', fullscreen: false, playerVars: { autoplay: 0, controls: 1, rel: 0 }});비디오 제어 메서드
Section titled “비디오 제어 메서드”// Playawait YoutubePlayer.playVideo(playerId);
// Pauseawait YoutubePlayer.pauseVideo(playerId);
// Stopawait YoutubePlayer.stopVideo(playerId);
// Seek to timeawait YoutubePlayer.seekTo(playerId, seconds, allowSeekAhead);
// Load video by IDawait YoutubePlayer.loadVideoById(playerId, { videoId: 'VIDEO_ID' });
// Cue video (load without playing)await YoutubePlayer.cueVideoById(playerId, { videoId: 'VIDEO_ID' });재생목록 제어
Section titled “재생목록 제어”// Load playlistawait YoutubePlayer.loadPlaylist(playerId, { listType: 'playlist', list: 'PLAYLIST_ID'});
// Cue playlistawait YoutubePlayer.cuePlaylist(playerId, { playlist: ['VIDEO_ID_1', 'VIDEO_ID_2'], index: 0});
// Navigate playlistawait YoutubePlayer.nextVideo(playerId);await YoutubePlayer.previousVideo(playerId);await YoutubePlayer.playVideoAt(playerId, index);오디오 제어
Section titled “오디오 제어”// Mute/Unmuteawait YoutubePlayer.mute(playerId);await YoutubePlayer.unMute(playerId);
const { result } = await YoutubePlayer.isMuted(playerId);console.log('Muted:', result.value);
// Volume (0-100)await YoutubePlayer.setVolume(playerId, 50);const { result } = await YoutubePlayer.getVolume(playerId);// Playback rateawait YoutubePlayer.setPlaybackRate(playerId, 1.5);const { result } = await YoutubePlayer.getPlaybackRate(playerId);
// Available ratesconst { result } = await YoutubePlayer.getAvailablePlaybackRates(playerId);console.log('Available rates:', result.value);
// Loop and shuffleawait YoutubePlayer.setLoop(playerId, true);await YoutubePlayer.setShuffle(playerId, true);// Set qualityawait YoutubePlayer.setPlaybackQuality(playerId, 'hd720');
// Get current qualityconst { result } = await YoutubePlayer.getPlaybackQuality(playerId);
// Get available qualitiesconst { result } = await YoutubePlayer.getAvailableQualityLevels(playerId);플레이어 정보
Section titled “플레이어 정보”// Durationconst { result } = await YoutubePlayer.getDuration(playerId);
// Current timeconst { result } = await YoutubePlayer.getCurrentTime(playerId);
// Loaded fractionconst { result } = await YoutubePlayer.getVideoLoadedFraction(playerId);
// Player stateconst { result } = await YoutubePlayer.getPlayerState(playerId);
// Video URLconst { result } = await YoutubePlayer.getVideoUrl(playerId);이벤트 리스너
Section titled “이벤트 리스너”// State changeYoutubePlayer.addEventListener(playerId, 'onStateChange', (event) => { console.log('State:', event.data); // -1, 0, 1, 2, 3, 5});
// ReadyYoutubePlayer.addEventListener(playerId, 'onReady', (event) => { console.log('Player ready');});
// ErrorYoutubePlayer.addEventListener(playerId, 'onError', (event) => { console.error('Player error:', event.data);});
// Quality changeYoutubePlayer.addEventListener(playerId, 'onPlaybackQualityChange', (event) => { console.log('Quality:', event.data);});
// Rate changeYoutubePlayer.addEventListener(playerId, 'onPlaybackRateChange', (event) => { console.log('Rate:', event.data);});
// Remove listenerYoutubePlayer.removeEventListener(playerId, 'onStateChange', callback);완전한 예제
Section titled “완전한 예제”import { YoutubePlayer } from '@capgo/capacitor-youtube-player';
export class YouTubeService { private playerId: string | null = null;
async initPlayer(videoId: string) { try { const { player, playerReady } = await YoutubePlayer.initialize({ playerId: 'main-player', playerSize: { width: 1280, height: 720 }, videoId, fullscreen: false, playerVars: { autoplay: 0, controls: 1, modestbranding: 1, rel: 0 } });
this.playerId = player;
// Set up event listeners YoutubePlayer.addEventListener(player, 'onReady', () => { console.log('Player is ready'); });
YoutubePlayer.addEventListener(player, 'onStateChange', (event) => { this.handleStateChange(event.data); });
YoutubePlayer.addEventListener(player, 'onError', (event) => { console.error('YouTube error:', event.data); });
return player; } catch (error) { console.error('Failed to initialize player:', error); throw error; } }
private handleStateChange(state: number) { switch (state) { case -1: console.log('Unstarted'); break; case 0: console.log('Ended'); break; case 1: console.log('Playing'); break; case 2: console.log('Paused'); break; case 3: console.log('Buffering'); break; case 5: console.log('Video cued'); break; } }
async play() { if (!this.playerId) return; await YoutubePlayer.playVideo(this.playerId); }
async pause() { if (!this.playerId) return; await YoutubePlayer.pauseVideo(this.playerId); }
async loadVideo(videoId: string) { if (!this.playerId) return; await YoutubePlayer.loadVideoById(this.playerId, { videoId }); }
async destroy() { if (!this.playerId) return; await YoutubePlayer.destroy(this.playerId); this.playerId = null; }}플레이어 상태
Section titled “플레이어 상태”| 상태 | 값 | 설명 |
|---|---|---|
| UNSTARTED | -1 | 비디오 시작 안됨 |
| ENDED | 0 | 비디오 종료됨 |
| PLAYING | 1 | 비디오 재생 중 |
| PAUSED | 2 | 비디오 일시 중지됨 |
| BUFFERING | 3 | 비디오 버퍼링 중 |
| CUED | 5 | 비디오 준비됨 |
small: 240pmedium: 360plarge: 480phd720: 720phd1080: 1080phighres: >1080pdefault: 자동 품질
- 한 번 초기화: 플레이어 인스턴스를 한 번 생성하고 재사용하세요
- 오류를 우아하게 처리: 오류 이벤트 리스너를 구현하세요
- 정리: 컴포넌트 언마운트 시 플레이어를 제거하세요
- 사용자 선호 존중: 사용자가 시작하지 않는 한 자동 재생하지 마세요
- 재생 모니터링: 진행 상황을 추적하세요
플랫폼 참고사항
Section titled “플랫폼 참고사항”- iOS 9.0+ 에서 작동
- YouTube iframe API와 함께 WKWebView 사용
- 전체 화면 지원
Android
Section titled “Android”- Android 5.0 (API 21)+ 에서 작동
- YouTube iframe API와 함께 WebView 사용
- 전체 화면 지원
- 직접 YouTube iframe 통합
- 전체 API 지원
- 최고의 성능