首页 > 其他分享 >网易云歌词的处理和简单的实时显示(uni-app)

网易云歌词的处理和简单的实时显示(uni-app)

时间:2023-03-11 13:14:58浏览次数:33  
标签:arr console log temp app 歌词 let uni

html设置

<!-- 歌词 -->
        <view class="scrollLrc">
          <text>{{currentLyric}}</text>
        </view>

1.在data中定义三个变量

    data() {
      return {
        lyric: [],//歌词
        lyricTime: 0,//歌词对应的时间
        currentLyric: "",//当前歌词对象
      };
    },
在监听音乐实时播放时获取歌词对应的时间(我这使用的是uni-app小程序项目,微信官方接口有直接监听音乐播放时的属性)
onLoad(options){
      //创建控制音乐播放的实例
      this.backgroundAudioManager=uni.getBackgroundAudioManager()
      //监听音乐实时播放的进度
      this.backgroundAudioManager.onTimeUpdate(()=>{
        this.musicPlayTime()
      })
    },
methods:{
      musicPlayTime(){
        //获取歌词对应时间 Math.ceil()向上取整
        let lyricTime = Math.ceil(this.backgroundAudioManager.currentTime);        
        //保存时间
        this.lyricTime=lyricTime
        // console.log(this.lyricTime);
        //获取当前歌词
        this.getCurrentLyric();
      },

2.先获取歌词信息 musicId是歌曲的id

async getLyric(musicId){
        let lyricData = await request("/lyric", {id: musicId});
        // console.log(lyricData);
        let lyric = this.formatLyric(lyricData.lrc.lyric);//歌词
        // console.log(lyric);
      },

3.调用方法处理歌词将时间和歌词拆分出来

获取歌词思路

最开始歌词的形式 通过split("\n")换行切割,变成数组的形式 (arr) 通过for循环将数组遍历出来 (temp_row) 通过“]”对时间和文本进行分离,变成数组的形式 (temp_arr) 通过pop()函数,保留歌词 (text)
formatLyric(text) {
        // console.log(text);
          let result = [];
          let arr = text.split("\n"); //原歌词文本已经换好行了方便很多,我们直接通过换行符“\n”进行切割
          // console.log(arr);
          let row = arr.length; //获取歌词行数
          for (let i = 0; i < row; i++) {
            let temp_row = arr[i]; //现在每一行格式大概就是这样"[00:04.302][02:10.00]hello world";
            // console.log(temp_row);
            let temp_arr = temp_row.split("]");//我们可以通过“]”对时间和文本进行分离,变成数组的形式
            // console.log(temp_arr);
            let text = temp_arr.pop(); //把歌词文本从数组中剔除出来,获取到歌词文本了!保留最后一个数组
            // console.log(text);
            }

获取歌词时间

通过对temp_arr进行遍历,使用substr()进行从1到9截取 再利用split()对":"进行分割得到分钟和秒数 计算出时间s 使用最开始定义的空数组result 将obj对象保存进数组
temp_arr.forEach(element => {
              // console.log(element);
              let obj = {};
              let time_arr = element.substr(1, element.length - 1).split(":");//先把多余的“[”去掉,再分离出分、秒
              let s = parseInt(time_arr[0]) * 60 + Math.ceil(time_arr[1]); //把时间转换成与currentTime相同的类型,方便待会实现滚动效果
              // console.log(s);
              obj.time = s;//时间
              obj.text = text;//歌词
              result.push(obj); //每一行歌词对象存到组件的lyric歌词属性里
              // console.log(result);
  });
            result.sort(this.sortRule) //由于不同时间的相同歌词我们给排到一起了,所以这里要以时间顺序重新排列一下
            this.lyric=result
            // console.log(this.lyric);
        },
        sortRule(a, b) { //设置一下排序规则
          return a.time - b.time;
        },
this.lyric的值

4.设置歌词实时播放

在监听音乐实时播放时调用函数实现歌词实时播放 如果监听到的时间等于数组中的时间 则显示当前时间的歌词
//控制歌词播放
        getCurrentLyric(){
          let j;
          for(j=0; j<this.$data.lyric.length-1; j++){
            if(this.$data.lyricTime == this.$data.lyric[j].time){
                this.currentLyric=this.$data.lyric[j].text
            }
          }
        },
   

标签:arr,console,log,temp,app,歌词,let,uni
From: https://www.cnblogs.com/happy-p/p/17205694.html

相关文章

  • 舍弃Nunit拥抱Xunit
    https://blog.csdn.net/uddiqpl/article/details/87560345 前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是......
  • 单元测试工具之Xunit
    https://www.bbsmax.com/A/nAJvkgba5r/ 在.NET开发中的单元测试工具之——xUnit.Net 原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320在上一篇《在.......
  • python unittest 接口自动化遇到的问题记录
    1.ConfigParser类读取config.ini的options全部返回为小写字母查看configparser.ConfigParser类中,是因为optionxform方法返回了optionstr.lower()defoptionxform(self,......
  • Communication System POJ - 1018
    目前有一个公司需要购进宽带设备,每种设备有多款机器供选择,每种设备都需购进一台,现给出每台设备的带宽p与价格q,要求选择设备的最小带宽min(p)/add(q)(其中min(p)表示所有购......
  • CefSharp C# App 中嵌入 Chrome 浏览器
    在本文中,你会学到如何轻松地将奇妙的CefSharp网页浏览器组件(基于Chromium)集成到你的C#app中。然后,你可以使用此web浏览器:   给用户提供一个集成的浏览体验   用HT......
  • 如何实现一个类似 Apple 网站的短信验证码登录组件 All In One
    如何实现一个类似Apple网站的短信验证码登录组件AllInOne支持短信,复制粘贴自动填充支持自动聚焦,自动校验输入完成,支持自动发起确认请求(无需手动点击确认按钮)......
  • 对某数藏类app逆向安全分析
    前言昨晚我群里有个老哥在问移动端滑块怎么分析   因为大多app端的滑块都是加载在webview上的我当时突然就想到才没几天搞定的一个app,也有webview部分的操作,因为......
  • 解决Azure App Services出站IP不固定问题
    最近遇到一个客户提出的关于AppServices出站IP地址的需求,具体如下:需求:运行在AppServices上的应用程序需要和很多外部系统做集成,也就是说,应用系统需要访问到外部应用获取一......
  • MybatisPlus(四) BaseMapper层CRUD相关接口使用
    BaseMapper接口API:Insert(添加):/***插入一条记录**@paramentity实体对象*/intinsert(Tentity);参数说明:类型参数名描述......
  • 【YonBuilder 移动开发】关于创建 App 是否需要 AVM 的经验分享
    概述开发者在使用YonBuilder移动开发技术,创建新项目的时候,通常都会有一个是否使用AVM的选项,见下图在Web网站控制台中创建应用的截图很多新手开发者可能都会有这样一......