花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 70|回复: 11

歌词同步加进度可控的canvas画布音频播放器

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2022-8-26 20:24 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    本帖最后由 马黑黑 于 2022-8-26 20:27 编辑

    评分

    参与人数 2威望 +100 金钱 +200 经验 +100 收起 理由
    红影 + 50 + 100 + 50 赞一个!
    小辣椒 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-26 20:26 | 显示全部楼层
    代码(不需要播放器边框时可去掉CSS里 #player 的 border 属性):
    1. <style>
    2.         #papa { left: -214px; width: 1024px; height: 640px; background: #ccc; box-shadow: 3px 3px 20px #000; position: relative; z-index: 1; }
    3.         #player { position: absolute; left: 10px; bottom: 10px; border: 1px solid; }
    4. </style>

    5. <div id="papa">
    6.         <canvas id="player"></canvas>
    7. </div>

    8. <script>
    9. let ctx = player.getContext('2d'), w = player.width = 350, h = player.height = 100, btnFlag, lineFlag, aud = new Audio();
    10. let mplayer = {
    11.         startX: 30, startY: 70, radius: 16, lineLen: 200, c_lrc: 'teal', c_time: 'teal', c_track: 'lightblue', c_prg: 'red', c_circle: 'lightblue', c_btn: 'snow', c_btnhover: 'pink',
    12.         drawLrc: function(text) {
    13.                 ctx.clearRect(0, 0, w, 50);
    14.                 ctx.fillStyle = this.c_lrc;
    15.                 ctx.textAlign = 'center';
    16.                 ctx.beginPath();
    17.                 ctx.font = '1.2em sans-serif';
    18.                 ctx.fillText(text, w/2, 30);
    19.                 ctx.fill();
    20.         },
    21.         drawProgress: function(prog, text) {
    22.                 ctx.clearRect(this.startX + this.radius, this.startY - 10, w - this.startX + this.radius, 40);
    23.                 ctx.beginPath();
    24.                 ctx.font = '14px sans-serif';
    25.                 ctx.textBaseline = 'middle';
    26.                 ctx.strokeStyle = this.c_track;
    27.                 ctx.moveTo(this.startX + this.radius + 4, this.startY);
    28.                 ctx.lineTo(this.startX + this.radius + 4 + this.lineLen, this.startY);
    29.                 ctx.stroke();
    30.                 ctx.beginPath();
    31.                 ctx.strokeStyle = this.c_prg;
    32.                 ctx.moveTo(this.startX + this.radius + 4, this.startY);
    33.                 ctx.lineTo(this.startX + this.radius + 4 + prog, this.startY);
    34.                 ctx.stroke();
    35.                 ctx.fillStyle = this.c_time;
    36.                 ctx.textAlign = 'left';
    37.                 ctx.fillText(text, this.startX + this.radius + 8 + this.lineLen, this.startY);
    38.                 ctx.fill();
    39.         },
    40.         drawBtn: function(id) {
    41.                 ctx.clearRect(this.startX - this.radius, this.startY - this.radius, this.radius * 2, this.radius * 2);
    42.                 ctx.fillStyle = this.c_circle;
    43.                 ctx.beginPath();
    44.                 ctx.arc(this.startX, this.startY, this.radius, 0, 2 * Math.PI);
    45.                 ctx.fill();
    46.                 ctx.fillStyle = btnFlag ? this.c_btnhover : this.c_btn;
    47.                 ctx.beginPath();
    48.                 if (id) {
    49.                         ctx.moveTo(this.startX - this.radius / 2 + 1, this.startY - this.radius / 2);
    50.                         ctx.lineTo(this.startX - this.radius / 2 + 1, this.startY + this.radius / 2);
    51.                         ctx.lineTo(this.startX + this.radius / 2 + 1, this.startY);
    52.                         ctx.fill();
    53.                 } else {
    54.                         ctx.fillRect(this.startX - this.radius / 2 + 5, this.startY - this.radius / 2, 2, this.radius);
    55.                         ctx.fillRect(this.startX - this.radius / 2 + 10, this.startY - this.radius / 2, 2, this.radius);
    56.                 }
    57.         },
    58.         setProgress: function() {
    59.                
    60.         },
    61.         isBtnHover: function (x, y) {
    62.                 return Math.pow(x - this.startX, 2) + Math.pow(y - this.startY, 2) <= Math.pow(this.radius, 2);
    63.         },
    64.         isLineHover: function(x, y) {
    65.                 let xx = this.startX + this.radius + 4, yy = this.startY - 5;
    66.                 return x >= xx && x <= xx + this.lineLen && y >= yy && y <= yy + 10;
    67.         },
    68. };
    69. let lrcAr = [
    70.         ['0.01','童安格  耶利亚女郎'],
    71.         ['34.10','很远的地方有个女郎  名字叫做耶利亚'],
    72.         ['42.33','有人在传说她的眼睛  看了使人更年轻'],
    73.         ['50.62','如果你得到她的拥抱  你就永远不会老'],
    74.         ['59.15','为了这个神奇的传说  我要努力去寻找'],
    75.         ['66.42','耶利亚神秘耶利亚  耶利耶利亚'],
    76.         ['74.77','耶利亚神秘耶利亚  我一定要找到她'],
    77.         ['101.12','很远的地方有个女郎  名字叫做耶利亚'],
    78.         ['109.32','有人在传说她的眼睛  看了使人更年轻'],
    79.         ['117.90','如果你得到她的拥抱  你就永远不会老'],
    80.         ['126.22','为了这个神奇的传说  我要努力去寻找'],
    81.         ['133.57','耶利亚神秘耶利亚  耶利耶利亚'],
    82.         ['141.90','耶利亚神秘耶利亚  我一定要找到她'],
    83.         ['150.29','耶利亚神秘耶利亚  耶利耶利亚'],
    84.         ['158.76','耶利亚神秘耶利亚  我一定要找到她'],
    85.         ['198.70','耶利亚神秘耶利亚  耶利耶利亚'],
    86.         ['207.11','耶利亚神秘耶利亚  我一定要找到她'],
    87.         ['215.28','耶利亚神秘耶利亚  耶利耶利亚'],
    88.         ['223.72','耶利亚神秘耶利亚  我一定要找到她']
    89. ];

    90. aud.src = 'https://music.163.com/song/media/outer/url?id=150852.mp3';
    91. aud.autoplay = true;
    92. aud.loop = true;
    93. mplayer.drawBtn(aud.paused);
    94. mplayer.drawProgress(1, '00:00 | 00:00');
    95. mplayer.drawLrc('等待播放 ...');

    96. player.addEventListener('mousemove', (e) => {
    97.         btnFlag = mplayer.isBtnHover(e.offsetX, e.offsetY), lineFlag = mplayer.isLineHover(e.offsetX, e.offsetY);
    98.         player.style.cursor = btnFlag || lineFlag ? 'pointer' : 'default';
    99.         mplayer.drawBtn(aud.paused);
    100. });

    101. player.addEventListener('click', (e) => {
    102.         if(btnFlag) aud.paused ? aud.play() : aud.pause();
    103.         if(lineFlag) aud.currentTime = aud.duration * (e.offsetX - mplayer.startX - mplayer.radius - 4) / mplayer.lineLen;
    104. });

    105. aud.addEventListener('playing', ()  => mplayer.drawBtn(false));
    106. aud.addEventListener('pause', ()  => mplayer.drawBtn(true));

    107. aud.addEventListener('timeupdate', () => {
    108.         let prg = mplayer.lineLen * aud.currentTime / aud.duration, tMsg = toMin(aud.duration) + ' | ' + toMin(aud.currentTime);
    109.         mplayer.drawProgress(prg, tMsg);
    110.         for(j = 0; j < lrcAr.length;  j ++) {
    111.                 if(aud.currentTime >= lrcAr[j][0]) mplayer.drawLrc(lrcAr[j][1]);
    112.         }
    113. });

    114. let toMin = (val)  => {
    115.         if (!val) return '00:00';
    116.         val = Math.floor(val);
    117.         let min = parseInt(val / 60), sec = parseFloat(val % 60);
    118.         if(min < 10) min = '0' + min;
    119.         if(sec < 10) sec = '0' + sec;
    120.         return min + ':' + sec;
    121. }
    122. </script>
    复制代码


    评分

    参与人数 2威望 +100 金钱 +200 经验 +100 收起 理由
    红影 + 50 + 100 + 50 赞一个!
    小辣椒 + 50 + 100 + 50 赞一个!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-26 20:31 | 显示全部楼层
    画布对代码量的需求大一些。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-25 21:11
  • 签到天数: 1 天

    [LV.1]初来乍到

    1421

    主题

    6万

    回帖

    12万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹心香一瓣音画大师天籁妙音风雨同行我心永远喜乐安康中秋征文指尖上的流年花潮管理

    发表于 2022-8-26 20:50 | 显示全部楼层
    黑黑辛苦,速度也是杠杆的,刚还在说有一个,回头就看见了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-25 21:11
  • 签到天数: 1 天

    [LV.1]初来乍到

    1421

    主题

    6万

    回帖

    12万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹心香一瓣音画大师天籁妙音风雨同行我心永远喜乐安康中秋征文指尖上的流年花潮管理

    发表于 2022-8-26 20:57 | 显示全部楼层
    黑黑我已经做进刚才的帖里面,这个播放器进度条可控,非常的棒
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-26 21:11 | 显示全部楼层
    小辣椒 发表于 2022-8-26 20:50
    黑黑辛苦,速度也是杠杆的,刚还在说有一个,回头就看见了

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-26 21:11 | 显示全部楼层
    小辣椒 发表于 2022-8-26 20:57
    黑黑我已经做进刚才的帖里面,这个播放器进度条可控,非常的棒

    对,可以调节播放进度,有用的功能
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-27 10:15 | 显示全部楼层
    这个可以调整进度了,太棒了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-27 10:16 | 显示全部楼层
    前面那个就想问了,如何才能进度条可控,没好意思问,结果黑黑自己就做出来了。很赞
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-27 10:36 | 显示全部楼层
    红影 发表于 2022-8-27 10:16
    前面那个就想问了,如何才能进度条可控,没好意思问,结果黑黑自己就做出来了。很赞

    之前做过进度可控的,这是举手之劳
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-27 19:50 | 显示全部楼层
    马黑黑 发表于 2022-8-27 10:36
    之前做过进度可控的,这是举手之劳

    黑黑厉害,简直佩服得无可名状
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-27 20:19 | 显示全部楼层
    红影 发表于 2022-8-27 19:50
    黑黑厉害,简直佩服得无可名状

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 22:12 , Processed in 0.073834 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表