阿里云 Aliplayer高级功能介绍(六):进度条标记

基本介绍

Aliplayer在进度条上提示时间和缩略图功能外,还可以进行视频内容的提示打点,当然不止是进度条上显示打点的内容,还提供一组接口,方便用户进行打点时间和内容的获取, 基本UI如下图所示:

fb725a7d4f5ac9c5c5ac1fa1aec73d06f780d406

接口和属性介绍

播放器提供了progressMakers属性,是一个数组类型,每一条记录包含offset时间和text打点的内容,还可以包含其他属性,此属性用于告诉播放器进度条打点记录,记录内容属性说明:

名称类型说明
offsetNumber打点的视频偏移时间,单位:秒
textString打点的文本信息,默认UI会使用
isCustomizedBoolean是否使用默认UI,不使用设置为true

事件

Aliplayer提供两个事件:鼠标进入进度条上的打点和鼠标离开进度条上的打点。

//鼠标进入进度条上的打点
player.on('markerDotOver', function(data) {
     let params = data.paramData,
     progressMarker = params.progressMarker, //打点记录信息
     left = params.left; //打点的离播放器左边的距离

 });

//鼠标离开进度条上的打点
player.on('markerDotOut', function() {
});

相关接口

为了方便打点内容的编辑提供了下面的接口:

接口名称参数说明
enterProgressMarker播放器进入打点编辑状态,在seek操作完成时,不会播放视频
exitProgressMarker播放器退出打编辑状态,在seek操作完成时,会继续播放视频
isInProgressMarker是否是打点编辑状态
getProgressMarkers获取打点数组

功能使用

下面会介绍播放器如何辅助用户进行打点信息的生成和维护。

打点Seek操作

用户在生成打点内容的时候,希望在seek操作时,视频不要播放,这时候就需要让播放器进入打点编辑状态,并且在seek完成时,能够得到当前seek到的时间,这样就可以进行时间和内容对应关系的编辑。

创建播放器时,订阅completeSeek事件,代码如下:

 player.on('completeSeek',function(e){
      console.log('seek完成:'+ e.paramData);
      //seek完成::12.875738146938774 单位为秒
 });

如果希望seek结束时画面时静止的,使用的代码如下:

<button click="switchProgressMarker()">开始打点</button>
  var switchProgressMarker = ()=>{
    if(!player.isInProgressMarker())
    {   //如果为进入编辑状态,调用enterProgressMarker
       player.enterProgressMarker();
    }
    else
    {
       //如果为已经是编辑状态,调用exitProgressMarker退出
       player.exitProgressMarker();
    }
 }

播放显示打点

打点信息通过在创建播放器的时候传给播放器,代码如下:

var player = new Aliplayer({
    id: "player-con",
    source: "//common.qupai.me/player/qupai.mp4",
    width: "100%",
    height: "500px",
    autoplay: true,
    progressMakers:[
       {offset:0,text:'阿里视频云端到云到端服务的重要一环'},
       {offset:10,text:'除了支持点播和直播的基础播放功能外'},
       {offset:20,text:'深度融合视频云业务'},
       {offset:30,text:'为用户提供简单、快速、安全、稳定的视频播放服务'},
       {offset:40,text:'安装播放器Demo进行体验'},
       {offset:50,text:'开发人员请点击SDK下载'}
    ],
  }, function (player) {
    console.log("播放器创建成功");
  });

这样进度条上就会有打点的标记, 鼠标放上去就会显示打点的内容:

70b0ba7fb5e8c12b4b54237ea97c0f99565fd614

自定义打点内容

Aliplayer默认打点的UI只显示文本, 如果需要显示其他的内容比如图片,并且UI需要自定义时,可以通过Aliplayer提供的自定义组件实现不同的打点UI,比如我要实现下面的自定义UI:

359de562ac1b0dc14f288887f2779da82c9daa19

自定义UI

通过Aliplayer提供的自定义组件的模式实现打点内容的显示UI,自定义组件里新增了markerDotOver、markerDotOut的hooker钩子,打点组件的代码实现如下:

 var ProgressMarkerComponent = Aliplayer.Component({
    createEl:function(el)
    {
       let htmlString = "<div class='progress-marker-container'>"+
                           "<img class='marker-img'></img>"+
                           "<div class='marker-text'></div>"+
                        "</div>";
        this.container = $(htmlString);
        $(el).append(this.container);
    },
    markerDotOver:function(player,data)
    {
       let progressMarker = data.progressMarker;
       this.container.find('.marker-img').attr('src', progressMarker.imgUrl);
       this.container.find('.marker-text').text(progressMarker.text);
       this.container.css('left',data.left*100 + "%");
       this.container.css('display','flex');
    },
    markerDotOut:function(player,data)
    {
       this.container.css('display','none');
    }
  });

对应的CSS:

    .progress-marker-container
    {
      position: absolute;
      width: 210px;
      height: 80px;
      display: none;
      justify-content: flex-start;
      align-items: center;
      color: #ffffff;
      bottom: 55px;
      background: rgba(0, 0, 0, 0.8);
    }

    .progress-marker-container .marker-img
    {
      width: 80px;
      height: 80px;
    }

    .progress-marker-container .marker-text
    {
      text-align: center;
      word-break: break-all;
    }

应用自定义打点组件

可以通过progressMarkers属性可以传除文本外的其他属性,在markDotOver事件发生时,会把对应的记录通过回调参数返回,并且通过components属性应用上面的ProgressMarkerComponent组件,代码如下:

var player = new Aliplayer({
    id: "player-con",
    source: "//common.qupai.me/player/qupai.mp4",
    width: "100%",
    height: "500px",
    autoplay: true,
    components:[{name:'progressMarkerComponent',type:ProgressMarkerComponent}],
    progressMakers:[
        {offset:0,isCustomized:true,text:'阿里视频云端到云到端服务的重要一环',imgUrl:'http://player.alicdn.com/demo/h5live/images/avatar.jpg'},
        {offset:10,isCustomized:true,text:'除了支持点播和直播的基础播放功能外',imgUrl:'http://player.alicdn.com/demo/h5live/images/avatar.jpg'},
        {offset:20,isCustomized:true,text:'深度融合视频云业务',imgUrl:'http://player.alicdn.com/demo/h5live/images/avatar.jpg'},
        {offset:30,isCustomized:true,text:'为用户提供简单、快速、安全、稳定的视频播放服务',imgUrl:'http://player.alicdn.com/demo/h5live/images/avatar.jpg'},
        {offset:40,isCustomized:true,text:'安装播放器Demo进行体验',imgUrl:'http://player.alicdn.com/demo/h5live/images/avatar.jpg'},
        {offset:50,isCustomized:true,text:'开发人员请点击SDK下载',imgUrl:'http://player.alicdn.com/demo/h5live/images/avatar.jpg'}
    ],
  }, function (player) {
    console.log("播放器创建成功");
  });

使用点播服务

后续点播服务会提供API,方便用户保存打点的内容到点播服务, Aliplayer会在用户使用videoId播放器方式时, 自动从云端获取打点的内容显示在进度条上, 播放时用户无需关心此视频是否有打点,用户使用此功能时更简单和方便。

 

原文链接
更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight

<think>好的,我现在需要帮助用户解决如何在前端开发中实现阿里云播放器进度条点击标记点时显示悬浮提示的功能。用户还要求提供示例代码。首先,我得先理解用户的需求,然后找出合适的解决方案。 首先,用户提到的是阿里云播放器,可能指的是阿里云提供的视频播放SDK,比如Aliplayer。我需要回忆一下阿里云播放器的文档,特别是关于进度条标记点和事件处理的部分。可能需要查看官方文档,确认是否有相关的API支持添加标记点和处理点击事件。 接下来,用户想要在点击标记点时显示悬浮提示。这涉及到几个步骤:1. 在进度条上添加标记点;2. 监听用户点击这些标记点的事件;3. 在点击时显示悬浮提示框。其中,悬浮提示可能需要自定义DOM元素,并根据点击位置动态定位。 关于添加标记点,阿里云播放器可能有配置项,比如在初始化时通过options设置markers数组,每个marker包含时间点和样式。这部分需要参考具体的文档,假设有这样的配置项,可以在初始化时添加。 然后是事件监听。播放器可能提供点击进度条的事件,但需要判断点击的位置是否在某个标记点附近。或者,如果标记点本身是DOM元素,可以直接绑定点击事件。但通常播放器的进度条是渲染在canvas或使用HTML5 video元素,可能需要通过播放器的API来获取点击的时间点,再判断是否有对应的标记点。 显示悬浮提示需要创建提示框元素,通常在点击时动态设置其内容和位置,并显示出来。需要注意提示框的位置应该跟随点击的位置,并且避免超出视口边界。 现在,我需要考虑示例代码的结构。首先初始化播放器,配置标记点。然后监听进度条的点击事件,或者在播放器的某个事件回调中处理点击。当检测到点击的位置接近某个标记点时,计算该点的位置,显示提示框。 可能的挑战是:如何准确判断点击的是哪个标记点,以及如何定位提示框。如果播放器提供点击事件的回调参数中包含时间信息,可以通过时间找到最近的标记点。然后,将时间转换为进度条的百分比,计算对应的横坐标,再定位提示框。 另外,悬浮提示可能需要CSS样式,比如绝对定位,背景颜色,箭头等,以美观地显示信息。还需要处理提示框的隐藏,可能在鼠标移出时或一段时间后自动隐藏,或者在下次点击时隐藏之前的提示。 现在,综合这些思考,我需要写出示例代码的大致结构。首先,引入阿里云播放器的SDK,创建播放器实例,配置markers。然后,监听相关事件,比如进度条的点击事件,或者播放器的seek事件。在事件处理函数中,获取点击的时间点,遍历markers数组,找到对应的标记点,然后显示提示框。 需要确保代码的正确性,比如正确获取DOM元素,处理事件参数,以及动态更新提示框的位置和内容。可能还需要考虑移动端的兼容性,比如触摸事件的处理。 最后,根据用户提供的引用内容,用户可能参考了类似若依框架的工作流,或者刷新加载的监听器实现。但在这个问题中,主要是前端的事件处理和DOM操作,可能引用中的代码结构可以参考事件监听的写法,比如设置onClick等回调函数。 总结步骤: 1. 初始化播放器并配置标记点。 2. 监听进度条的点击事件,获取点击的时间点。 3. 查找该时间点对应的标记点信息。 4. 动态创建或显示悬浮提示框,设置内容和位置。 5. 处理提示框的隐藏逻辑。 现在,将这些步骤转化为具体的代码示例,并确保符合用户的要求,比如使用Vue.js框架或其他前端技术,但用户没有指定,所以可能需要使用纯JavaScript示例。</think>### 实现阿里云播放器进度条标记点悬浮提示功能 #### 1. 初始化播放器并配置标记点 ```javascript // 初始化阿里云播放器 var player = new Aliplayer({ id: "player-container", source: "your-video-url.mp4", width: "100%", height: "400px", // 配置进度条标记点 progressMarkers: [{ time: 10, // 标记点时间(秒) text: "产品介绍开始", // 提示内容 style: { color: "#FF6A00", // 标记点颜色 width: "4px" // 标记点宽度 } }, { time: 30, text: "核心技术解析", style: { color: "#00BFFF", width: "4px" } }] }); ``` #### 2. 监听进度条点击事件 ```javascript player.on('seek', function(event) { const currentTime = event.paramData.currentTime; const markers = player._options.progressMarkers; // 查找最近标记点(误差±1秒) const targetMarker = markers.find(marker => Math.abs(marker.time - currentTime) <= 1 ); if (targetMarker) showTooltip(targetMarker, event); }); // 创建悬浮提示容器 const tooltip = document.createElement('div'); tooltip.className = 'marker-tooltip'; document.body.appendChild(tooltip); ``` #### 3. 悬浮提示显示逻辑 ```javascript function showTooltip(marker, event) { // 获取进度条坐标信息 const progressBar = document.querySelector('.prism-progress'); const rect = progressBar.getBoundingClientRect(); // 计算标记点位置 const markerPosition = (marker.time / player.getDuration()) * rect.width; // 设置提示框位置 tooltip.style.display = 'block'; tooltip.innerHTML = marker.text; tooltip.style.left = `${rect.left + markerPosition - 30}px`; tooltip.style.top = `${rect.top - 40}px`; // 2秒后自动隐藏 setTimeout(() => tooltip.style.display = 'none', 2000); } ``` #### 4. CSS样式定义 ```css .marker-tooltip { position: absolute; padding: 8px 12px; background: rgba(0,0,0,0.8); color: white; border-radius: 4px; font-size: 12px; pointer-events: none; transform: translateX(-50%); white-space: nowrap; } .marker-tooltip::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: rgba(0,0,0,0.8) transparent transparent; } ``` ### 实现要点说明 1. **标记点配置**:通过`progressMarkers`参数定义时间点和样式,支持动态更新配置[^1] 2. **事件监听**:使用播放器原生`seek`事件捕获进度条交互动作 3. **坐标计算**:通过`getBoundingClientRect`获取进度条实际渲染尺寸 4. **性能优化**:使用防抖技术避免高频触发,DOM操作复用元素 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值