# Youtube iframe API
>監控於iframe內嵌youtube影片之狀態,並能進行操作
>[參考文件](https://developers.google.com/youtube/iframe_api_reference)
## 一、使用方式:
### 1. 插入API
```
<script src="https://www.youtube.com/iframe_api"></script>
```
### 2. 設置內嵌影片區塊
> 方式一
讓程式自行產出整塊iframe
範例:
```
<div id="your_iframe_id"></div>
```
> 方式二
預先設定好iframe的各種設定
範例:
```
<iframe width="100%" height="100%"
id="your_iframe_id"
src="https://www.youtube.com/embed/your_youtube_id?enablejsapi=1"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen
onload="onYouTubeIframeAPIReady()"></iframe>
```
補充說明:
1. youtube_id後一定要加入"?enablejsapi=1"允許API控制影片,否則無效
2. 鑑於安全性問題官方建議加入origin參數,並將網域設定為其參數值,排除外部入侵
3. 需加上onload="function_name()"
### 3. 撰寫要做的事情
> 對應方式一:
```
<script>
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '360', //設定視口高度
width: '640', //設定視口寬度
更多參數請參考置頂文件
videoId: 'your_youtube_id',
events: {
'onReady': onPlayerReady, //dom ready時執行function
'onStateChange': onPlayerStateChange //影片狀態變化時執行function
}
});
}
function onPlayerReady(event) {
do something... ...
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
do something... ...
}
}
```
---
> 對應方式二:
```
<script>
function onYouTubeIframeAPIReady() {
var video_id='your_iframe_id'
var player = new YT.Player(video_id, {
events: {
'onStateChange': function(event) {
if (event.data == YT.PlayerState.PLAYING) {
do something... ...
}
}
}
});
}
</script>
```
## 二、單頁多個嵌入影片控制方式
> 目前測試可行的方案為:
> 有一組youtube_id就建立一組
```
var video_id='your_iframe_id'
var player = new YT.Player(video_id, {
events: {
'onStateChange': function(event) {
if (event.data == YT.PlayerState.PLAYING) {
do something... ...
}
}
}
});
```
參考範例:
```
<script>
function onYouTubeIframeAPIReady() {
<?php foreach ($content->store_youtube as $key => $youtube_id) :
if ($key < 3) : ?>
var video_id<?=$key+1;?>='<?=$youtube_id;?>'
var player<?=$key+1;?> = new YT.Player(video_id<?=$key+1;?>, {
events: {
'onStateChange': function(event) {
if (event.data == YT.PlayerState.PLAYING) {
do something... ...
}
}
}
});
<?php endif; ?>
<?php endforeach; ?>
}
</script>
```
## 三、播放器事件
* onReady
* onStateChange
* -1 =>未開始 (YT.PlayerState.UNSTARTED)
* 0 =>已結束(YT.PlayerState.ENDED)
* 1 =>正在播放 (YT.PlayerState.PLAYING)
* 2 =>已暫停 (YT.PlayerState.PAUSED)
* 3 =>正在緩衝 (YT.PlayerState.BUFFERING)
* 5 =>影片已插入 (YT.PlayerState.CUED)
* onPlaybackQualityChange :當有設定setPlaybackQuality參數(指定尺寸)時,會於參數變動時觸發
* small
* medium
* large
* hd720
* hd1080
* highres
* onPlaybackRateChange :當播放速度發生變動時觸發
* onError
* 2 =>請求包含無效參數 ex:videoID包含無效字符
* 5 =>請求內容無法在HTML5播放或是其他與HTML5播放器相關的錯誤
* 100 =>找不到請求的影片
* 101 =>所請求影片的所有者禁止於嵌入式播放器播放
* 150 =>幾乎等於101,官方文件也沒寫清楚
* onApiChange :播放器以提供的Api加載即觸發
## 四、播放器控制項
> 隊列函數
* .cueVideoById
* .loadVideoById
* .cueVideoByUrl
* .loadVideoByUrl
> 播放影片
* .playVideo():播放當前載入的影片
* .pauseVideo():暫停正在播放的影片
* .stopVideo():停止加載當前影片
* .seekTo(seconds:Number, allowSeekAhead:Boolean):定位到影片指定的時間
> 播放列表影片
* .nextVideo():加載並播放下一個影片
* .previousVideo():加載並播放上一個影片
* .playVideoAt(index:Number):指定加載並播放影片列表的影片
> 變更音量
* .mute():靜音
* .unmute():取消靜音
* .isMuted():播放器狀態(靜音:true,非靜音:false)
* .setVolume(volume:Number):控制音量大小(0~100)
* .getVolume():取得目前音量值
> 播放器大小
* .setSize(width:Number, height:Number):設置播放器大小
> 播放器速度
* .getPlaybackRate():設置播放速度(0.25, 0.5, 1, 1.5 ,2)
* .setPlaybackRate():可設置建議的播放速度
* .getAvailablePlaybackRates():用於返回適合當前影片的速度
> 設定播放列表行為
* .setLoop(boolean):指定是否循環播放列表影片
* .setShuffle():指定影片是否隨機播放
> 播放狀態
* .getVideoLoadedFraction():回傳0~1的值,用於指定緩衝時播放器顯示的影片百分比
* .getPlayerState():回傳影片狀態
* .getCurrentTime():回傳影片已播放的時長
> 播放尺寸
* .getPlaybackQuality():用於檢索目前影片的實際尺寸,返回值可能為highres、hd1080、hd720、large、medium 和 small,若當前無影片則為undefined
* .setPlaybackQuality:用於設定建議的影片尺寸,若尺寸確實發生變化則會觸發onPlaybackQualityChange事件
* small =>播放器高度为240像素,且播放器尺寸至少为 320x240 像素才能符合 4:3 的寬高比
* medium =>播放器高度为360像素,且播放器尺寸为 640x360 像素(符合16:9的寬高比)或 480x360 像素(符合 4:3 的寬高比)
* large =>播放器高度为480像素,且播放器尺寸为 853x480 像素(符合 16:9 的寬高比)或 640x480 像素(符合 4:3 的寬高比)
* hd720 =>播放器高度为720像素,且播放器尺寸为 1280x720 像素(符合 16:9 的寬高比)或 960x720像素(符合 4:3 的寬高比)
* hd1080 =>播放器高度为1080像素,且播放器尺寸为 1920x1080 像素(符合 16:9 的寬高比)或 1440x1080 像素(符合 4:3 的寬高比)
* highres =>播放器高度大于1080像素,这意味着播放器的寬高比大于 1920x1080 像素
* default =>會自動選擇合適的尺寸
* .getAvailableQualityLevels():回傳適合當前影片的尺寸格式
> 檢索影片資訊
* .getDuration():回傳影片時長
* .getVideoUrl():回傳加載中的影片YouTube.com網址
* .getVideoEmbedCode():回傳加載中的影片嵌入代碼
> 檢索影片列表資訊
* .getPlaylist():回傳目前播放列表的ID組
* .getPlaylistIndex():回傳目前播放列表的索引
> 增加或移除事件監聽
* .addEventListener(event:String, listener:String):為指定event增加監聽器函數
* .removeEventListener(event:String, listener:String):移除指定event的監聽函數
> 訪問或修改DOM節點
* .getIframe():回傳嵌入式iFrame節點
* .destroy():移除包含的iFrame
## 五、播放器參數
| 參數 ||
| ---- | ---- |
|autoplay|指定播放器是否自動播放,預設為0,需與mute同時使用才有效|
|mute|靜音|
|cc_load_policy|設置是否顯示字幕|
|cc_lang_pref|此參數用於指定播放器顯示字幕的預設語言。 [參數設定參考](https://www.loc.gov/standards/iso639-2/php/code_list.php)|
|hl|設定播放器界面語言,參數同 cc_lang_pref|
| color | 指定已看過之進度條顏色,參數 white/red |
|controls|是否顯示播放器控制項,預設為1|
|disablekb|是否支援鍵盤控制播放器,預設為0(支援)|
|enablejsapi|是否允許通過iFrame或JavaScript Player API控制播放器,預設為0|
|origin|iframe API提供之額外安全設置,且僅支援iFrame嵌入式播放器,參數值為嵌入影片的網域|
|start|指定影片開始播放的位置,須為正整數,單位/秒。但有可能會有1~2秒的誤差範圍|
|end|用於指定時間,從影片開頭至應該結束為止(並非以start設定的開頭開始計算)|
|fs|是否顯示全螢幕按鈕,預設為1|
|iv_load_policy|是否顯示註釋,預設為1,<font color=red>不顯示為3</font>|
|list|與listType參數搭配確定播放器加載內容,使用此二參數則不需指定影片ID|
|listType|有效參數包含:<br>playlist =>list將指定播放列表ID(需使用PL作為ID前綴)<br>search =>list將指定搜索查詢<br>user_uploads =>list將會確認將要加載的影片所在的頻道(list指定user name)|
|modestbranding|是否顯示youtube LOGO|
|loop|設定影片是否循環播放,預設為0,配合playlist設定|
|playlist|指定要播放的影片ID列表(以逗號為分隔)|
|playsinline|此參數控制影片於IOS上的播放器是以內嵌或是全螢幕方式播放,0為全螢幕(預設),1為 allowsInlineMediaPlayback 属性值設為 TRUE 的情况下建立的 UIWebViews 會以内嵌方式播放|
|rel|可用參數為<br>0 =>推薦影片將從同一頻道選出<br>1 =>會顯示相關推薦影片|
|widget_referrer|此參數用於標記嵌入播放器的網址,YouTube 數據分析會使用此參數以標記與流量來源相關的網域|