如何使用 Flowplayer javascript API 为嵌入的视频创建点击事件?

How to create onclick events for video embedded using the Flowplayer javascript API?

我的目标是在我的播放器下方添加跳转到视频中特定时刻的按钮。

有一个演示示例基本上可以满足我的要求: https://flowplayer.com/demos/using-the-api然而 它基于 Flowplayer 的云播放器实现,我使用的是 Javascript API 嵌入我的播放器。基本的相关脚本是这样的:

flowplayer.cloud.then(function () {
    var api = flowplayer("#player")

    seek3.onclick = function() {
      api.fas.seek_to('00:01:01:11');
    }
});

我找到的使用 Javascript API 创建按钮的示例如下:

flowplayer(function(opts, root, api) {

    // small jQuery-compatible utility built inside the player
    var $ = flowplayer.mq;

    // render a custom button when the player is mounted
    api.on('mount', function() {
    var btn = $('<button>').txt('Test Button').on('click', function() {
    api.toggleMute();
    });

    $('.fp-controls', root).append(btn);

    });

});

我的播放器很好用。但是,当我尝试合并这两种方法时,我失败了。这是损坏的代码:

flowplayer(function(opts, root, api) {

   var api = flowplayer("#flowplayer");

    seek3.onclick = function() {
      api.fas.seek_to('00:01:01:11');
    }

 });

我也试过作为替代品

document.getElementById('seek3').onclick = function()

$('#seek1').onclick = function() {

(前面是从工作示例中借用的附加代码行):

var $ = flowplayer.mq;

但是对于每一种变化,我都会不断收到以下错误:"Uncaught TypeError: Cannot set property 'onclick' of null"。

如有任何帮助,我们将不胜感激。我发现 Flowplayer 文档真的很难用,因为在搜索结果中通常很难判断引用的是哪个版本的播放器。除了解决这个特定问题之外,我真的很想找到一些关于与 API 交互的基本信息。

对于可能在与 API 交互时遇到困难的任何其他人,Flowplayer 贴心地发布了一个新的演示示例——其功能与 cloudplayer 演示中的类似,但这个示例是针对 javascript玩家:https://codepen.io/team/flowplayer/pen/KOzWOK

var api = flowplayer("#player", 
  { src      : "//edge.flowplayer.org/drive.m3u8"
  , autoplay : false
  , token    : "eyJraWQiOiJqOEF6djg5NlJMMWIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjIjoie1wiYWNsXCI6NixcImlkXCI6XCJqOEF6djg5NlJMMWJcIixcImRvbWFpblwiOltcIm5ncm9rLmlvXCJdfSIsImlzcyI6IkZsb3dwbGF5ZXIifQ.UtJliSh4IcIKs71PVzXWdIrJJ8-1_KRK0hKd7OKp5EJhAdpZStuYbbU4bgDs--C6Gak6OBrb-xQBh6sd4dyrlA"
  , muted    : true
  })

/**
 * helper function to seek if possible or 
 * tell the player to seek when possible
 * 
 * btn     {HTMLElement}
 * seconds {Number}
 */
function chapter (btn, seconds) {
  btn.onclick = function () {
    // player is preload=none so we must tell 
    // the player to seek when it is possible
    if (api.readyState == 0) api.setOpts({start_time: seconds})
    // player has already started loading content
    if (api.readyState > 0) api.currentTime = seconds
    // attempt to play content
    api.togglePlay(true)
  }
}
// bind the buttons to times
chapter(seek1, 20)
chapter(seek2, 45)
chapter(seek3, 60)

我的工作版本包含以下 JS 代码变体:

/**
 * helper function to seek if possible or 
 * tell the player to seek when possible
 * 
 * seconds {Number}
 */
function seek_to_cue (seconds) {
  //alert('bingo?'); //tft
  // player is preload=none so we must tell the player to seek when it is possible
  if (api.readyState == 0) {
      api.setOpts({start_time: seconds});
  }
  // player has already started loading content
  if (api.readyState > 0) {
      api.currentTime = seconds;
  }
  // attempt to play content
  api.togglePlay(true);
}

在我的 PHP 代码中包含 JS 播放器调用:

$button_actions .= 'document.getElementById("'.$button_id.'").addEventListener("click", function(){ seek_to_cue('.$start_time_seconds.'); });';