2

我開始編寫一個網絡應用程序,該應用程序允許用戶使用特定事件對嵌入的YouTube視頻進行註釋。我希望用戶能夠暫停視頻,拉起候選事件菜單(例如作爲模式),並將選定的事件以及事件發生的視頻中的關聯時間保存到數據庫中。記錄用戶點擊暫停按鈕的距離

我不知道如何檢索按下暫停按鈕的時間。

我假設YouTube的API將是這個地方,但我花了大約兩個小時探索和找不到線索。任何方法的建議?良好的可訪問教程/這適合初學者的例子?

回答

2

您可以使用Youtube iframe API使用player.getCurrentTime()拿到狀態PAUSED當前時間:

HTML:

<iframe id="video" src="https://www.youtube.com/embed/CaksNlNniis?enablejsapi=1&html5=1&" frameborder="0" allowfullscreen="0"></iframe> 
<input id="pause" type="submit" value="pause" /> 
<input id="play" type="submit" value="play" /> 

的Javascript:

var player; 

function onYouTubeIframeAPIReady() { 
    player = new YT.Player('video', { 
    events: { 
     'onReady': onPlayerReady, 
     'onStateChange': onPlayerStateChange 
    } 
    }); 
} 

function onPlayerStateChange(event) { 
    if (event.data == YT.PlayerState.PAUSED) { 
    console.log(player.getCurrentTime()); 
    } 
} 

function onPlayerReady(event) { 
    document.getElementById("pause").addEventListener("click", function() { 
    player.pauseVideo(); 
    }); 
    document.getElementById("play").addEventListener("click", function() { 
    player.playVideo(); 
    }); 
} 

var tag = document.createElement('script'); 
tag.src = "//www.youtube.com/player_api"; 
var firstScriptTag = document.getElementsByTagName('script')[0]; 
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 

你可以找到一個工作的jsfiddle here

由於PAUSED狀態也可以獨立從您的按鈕點擊觸發的,你也可以存儲currentTime的調用player.pauseVideo()前:

HTML:

<iframe id="video" src="https://www.youtube.com/embed/CaksNlNniis?enablejsapi=1&html5=1&" frameborder="0" allowfullscreen="0"></iframe> 
<input id="pause" type="submit" value="pause" /> 
<input id="play" type="submit" value="play" /> 
<ul id="timing"></ul> 

的Javascript:

var player; 
var timeList; 
var count = 0; 

function onYouTubeIframeAPIReady() { 
    player = new YT.Player('video', { 
    events: { 
     'onReady': onPlayerReady, 
     'onStateChange': onPlayerStateChange 
    } 
    }); 
} 

function onPlayerStateChange(event) {} 

function onPlayerReady(event) { 
    document.getElementById("pause").addEventListener("click", function() { 
    logTime(); 
    player.pauseVideo(); 
    }); 
    document.getElementById("play").addEventListener("click", function() { 
    player.playVideo(); 
    }); 
} 

document.addEventListener("DOMContentLoaded", function(event) { 
    timeList = document.getElementById("timing"); 
}); 

function logTime() { 
    count++; 
    var time = player.getCurrentTime(); 
    var newTime = document.createElement('li'); 
    var textNode = document.createTextNode('pause ' + count + ' - ' + time + " "); 
    var buttonNode = document.createElement('button'); 
    buttonNode.addEventListener("click", function() { 
    console.log("go to " + time); 
    player.seekTo(time); 
    player.playVideo(); 
    }); 
    var btnText = document.createTextNode("go back"); 
    buttonNode.appendChild(btnText); 
    newTime.appendChild(textNode); 
    newTime.appendChild(buttonNode); 
    buttonNode.appendChild(btnText); 
    timeList.appendChild(newTime); 
} 

var tag = document.createElement('script'); 
tag.src = "//www.youtube.com/player_api"; 
var firstScriptTag = document.getElementsByTagName('script')[0]; 
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 

檢查this fiddle

+0

謝謝@Bertrand Martel。我收到以下錯誤:「找不到名字'YT'」。有什麼建議? – Atticus29

+0

@ Atticus29你有一個演繹這個錯誤的小提琴嗎?您是否像指定的[這裏](https://developers.google.com/youtube/player_parameters)以及小提琴一樣包含了「https:// www.youtube.com/player_api」。 –

+0

我從字面上將你的html複製到我的angular組件的html文件中,並將你的js複製到我的組件的打字稿文件中。順便說一句,我沒有看到https://www.youtube.com/player_api包含在你的小提琴中。雖然對小提琴來說很新奇;也許我不是在正確的地方尋找它? – Atticus29