java 歌词解析 源代码, 在windows10下调试运行成功。

news2024/12/28 4:02:11

需要两个素材。  歌词与音乐.wav

package week3.exam6;

public class Info {
    private final String info;
    public Info(String info){
        this.info=info;
    }

    public String getInfo() {
        return info;
    }
    public String toString(){
        return info;
    }
}

package week3.exam6;

public class Lyric extends Info{
    private long time;
    private String strTime;

    public long getTime() {
        return time;
    }
    public Lyric(String lyric,String strTime){
        super(lyric);
        this.strTime=strTime;
        time = calSeconds(this.strTime);
    }
    private  long calSeconds(String str){
        long minute;
        double second;
        String[] arrStr=str.split(":");
        minute=Long.parseLong(arrStr[0]);
        second=Double.parseDouble(arrStr[1]);
        return(long)((minute*60+second)*1000);
    }
    public String toString(){
        return strTime +" "+super.toString();
    }
}

package week3.exam6;

import javax.sound.sampled.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Yun2_4 {
    static Lyric[] lyrics = new Lyric[100];// 定义一个数组用于存储歌词
    static int length = 0;// 实际歌词的元素个数

    public static void main(String[] args) {
        String cyanText="\u001B[36m";
        String yellowText="\u001B[33m";
        String resetText="\u001B[0m";
        System.out.println(cyanText +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~成员信息~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+resetText);
        System.out.println(cyanText + "    云二    4组   2220010114 " + yellowText + "  李松博 " + resetText + "    何以解忧?唯有暴富!");
        System.out.println(cyanText + "    云二    4组   2220010070 " + yellowText + "  张兆鑫 " + resetText + "    读万卷书行万里路");
        System.out.println(cyanText + "    云二    4组   2220010048 " + yellowText + "  陈鑫 " + resetText + "      何学如逆水行舟,不进则退。");
        System.out.println(cyanText + "    云二    4组   2220020055 " + yellowText + "  刘子厚 " + resetText + "    改变总是好事。");
        System.out.println(cyanText + "    云二    4组   2220010103 " + yellowText + "  毛宇恒 " + resetText + "    努力加油!");
        System.out.println(cyanText + "    云二    4组   2220020044 " + yellowText + "  任旭龙 " + resetText + "    光而不耀,与光同行");

        System.out.println(cyanText +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+ resetText);
        System.out.println();
        System.out.println();
        System.out.println("\u001B[32m"+"欢迎使用音乐播放器!");


        System.out.println("\u001B[33m"+ "正在播放音乐:真心英雄 - 李宗盛");//音乐名称

        String musicFile = "真心英雄.wav"; //歌曲文件的路径,绝对路径或者相对路径,音乐格式个别不能播放

        Clip clip = null;//播放音乐的接口,初始化
        try {
            File file = new File(musicFile);
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(file);//通过AudioSystem.getAudioInputStream(file)方法获取音频输入流audioStream
            clip = AudioSystem.getClip();//AudioSystem.getClip()用于获取一个clip对象
            clip.open(audioStream);//准备播放音乐
        } catch (UnsupportedAudioFileException | LineUnavailableException | IOException e) {
            e.printStackTrace();
        }//处理音乐不能播放的情况


        String[] arr = readFile("hero.lrc");//歌词的路径,可以是相对路径或绝对路径

        // 加工数据
        processingData(arr);

        //歌词排序
        sort();

        clip.start();//打开音乐播放
        showLyric();//歌词显示
    }

    public static String[] readFile(String fileName) {
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            /*
             * 使用try-with-resources语句,创建一个BufferedReader对象并初始化它
             *BufferedReader将使用FileReader来读取指定文件的内容*/
            String[] arrStr = new String[100];
            int cnt = 0;//用于记录行数
            String line;
            while ((line = reader.readLine()) != null) {
                arrStr[cnt] = line;
                cnt++;
                /*
                 * 通过循环reader.readLine()方法会读取文件的下一行,并将其存储在line变量中
                 * 如果读取的行不为空,则将其存储在arrStr数组的当前索引位置,然后索引++*/
            }
            String[] arr = new String[cnt]; //创建一个新的数组,大小为歌词拥有的行数
            System.arraycopy(arrStr, 0, arr, 0, cnt);
            /*
             *  System.arraycopy复制方法,复制一个新的数组去掉多余的空
             *  arrStr表示是原数组,0表示起始位置,arr表示复制的目标数组,0表示起始位置,cnt表示复制元素的个数*/
            return arr;//返回值arr数组
        } catch (IOException e) {
            throw new RuntimeException(e);
        }//错误处理方法
    }

    /*try {
        Scanner sc = new Scanner(new File(fileName));
        String[] arrStr = new String[100];

        while (sc.hasNext()) {
            String line = sc.nextLine();


            arrStr[cnt] = line;
            cnt++;
        }
        String[] arr = new String[cnt];


        System.arraycopy(arrStr, 0, arr, 0, cnt);

        sc.close();
        return arr;

    } catch (FileNotFoundException e) {
        throw new RuntimeException(e);
    }
}

*/
    public static void processingData(String[] arr) {
        for (String s : arr) {
            Lyric[] tmp = lyricSplit(s);//将当前字符串s拆分为Lyric对象数组tmp
            System.arraycopy(tmp, 0, lyrics, length, tmp.length);// System.arraycopy()方法将tmp数组中的元素复制到全局的lyrics数组
            length += tmp.length;//更新歌词长度
        }
    }

    // 歌词字符串拆分为Lyric对象数组,其中每个Lyric对象包含了歌词内容和对应的时间。
    public static Lyric[] lyricSplit(String str) {
        String[] strArr = str.split("]");
        int length = strArr.length - 1;// 使用split()方法将字符串str按照"]"进行拆分,得到一个字符串数组strArr。数组的长度减1得到变量length,表示有几个显示点。
        String lyric = strArr[length];//从strArr数组中获取最后一个元素,即歌词内容,赋值给变量lyric
        Lyric[] lyrics = new Lyric[length];//建一个长度为length的Lyric对象数组lyrics
        for (int i = 0; i < length; i++) {
            strArr[i] = strArr[i].substring(1);
            lyrics[i] = new Lyric(lyric, strArr[i]);
            /*用循环遍历strArr数组的前length个元素。
            在每次循环中,将strArr[i]的第一个字符去掉,得到去掉显示点的时间字符串,
            然后使用lyric和时间字符串创建一个Lyric对象,并将其赋值给lyrics数组的相应位置。
            * */
        }
        return lyrics;//返回lyrics数组,其中包含了拆分后的歌词数据
    }

    // 冒泡法排序歌词
    public static void sort() {
        for (int i = 0; i < length - 1; i++) {//比较轮数
            for (int j = 0; j < length - i - 1; j++) {//比较次数
                if (lyrics[j].getTime() > lyrics[j + 1].getTime()) {//如果前面的歌词时间大于后面则调换顺序
                    Lyric lyric = lyrics[j];
                    lyrics[j] = lyrics[j + 1];
                    lyrics[j + 1] = lyric;
                }
            }
        }
    }

    public static void showLyric() {
        long start = System.currentTimeMillis();//首先获取当前时间的毫秒数,并将其赋值给变量start作为起始时间
        int cnt = 0;//追踪已经展示的歌词数量
        System.out.println("\u001B[36m" + " ~~~~~~~~~~~~~~~~~~~~~~歌词信息~~~~~~~~~~~~~~~~~~~~~~~~~" + "\u001B[0m");

        while (cnt < length) {//只要cnt小于歌词数组的长度,就执行以下操作
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            long current = System.currentTimeMillis() - start;//计算当前时间与起始时间的差值,并将其赋值给变量current,表示已经过去的时间
            if (current > lyrics[cnt].getTime()) {//如果current大于当前歌词对象的时间,说明该歌词应该被展示
                String lyric = lyrics[cnt].toString();//将当前歌词对象转换为字符串,并将其赋值给变量lyric
                String formattedLyric = "\u001B[35m" + "\u001B[1m" + "\u001B[4m" + lyric + "\u001B[0m"; // 设置歌词颜色为红色 加粗 下划线
                System.out.println("\u001B[34m" + "  * " + "\u001B[0m" + formattedLyric);

                cnt++;

            }
        }
        System.out.println("播放结束了~~~!");
    }

}

//hero.lrc

[ti:真心英雄]
[ar:成龙]
[al:1]
[by:w]
[00:00.00][00:08.22]周华健、成龙、黄耀明、李宗盛演唱
[00:09.08]李宗盛词曲
[01:53.46][00:10.07][01:55.54][00:11.60]周:在我心中曾经有一个梦
[02:00.11][00:17.34]要用歌声让你忘了所有的痛
[02:05.68][00:21.29]成:灿烂星空谁是真的英雄
[02:10.49][00:27.87]平凡的人们给我最多感动
[02:15.50][00:32.20]黄:再没有恨也没有了痛
[02:20.91][00:37.88]但愿人间处处都有爱的影踪
[02:26.07][00:41.89]李:用我们的歌换你真心笑容
[02:31.23][00:48.23]合:祝福你的人生从此与众不同
[02:35.69][00:52.74][03:18.02][02:36.61][00:53.96]把握生命里的每一分钟
[03:22.81][02:41.27][00:58.68]全力以赴我们心中的梦
[03:27.96][02:46.10][01:03.30]不经历风雨怎么见彩虹
[03:33.09][02:51.98][01:09.05]没有人能随随便便成功
[03:37.84][02:56.25][01:12.94][03:38.44][02:57.03][01:14.54]把握生命里每一次感动
[03:43.17][03:01.84][01:18.87]和心爱的朋友热情相拥
[03:48.41][03:07.48][01:23.90]让真心的话和开心的泪
[03:53.73][03:12.05][01:29.70]在你我的心里流动
[03:58.31][01:33.65][03:59.46]LaLaLaLa.........
[04:18.84]把握生命里每一次感动
[04:23.97]和心爱的朋友热情相拥
[04:29.66]让真心的话和开心的泪
[04:34.64]在你我的心里流动
[04:39.98]让真心的话和开心的泪
[04:44.99]在你我的心里流动.
[04:48.86]
[04:49.70]
[04:50.38]
[01:36.2]

音频直接找博主要吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云新用户云服务器优惠价格表

华为云服务器作为业界领先的云服务提供商之一&#xff0c;一直致力于为全球用户提供高效、稳定、安全的云服务。为了帮助新用户更好地了解华为云服务器的价格和优惠活动&#xff0c;本文将详细介绍华为云服务器对新用户的优惠价格表。 一、华为云耀云服务器L实例价格表 华为云…

JavaScript基础知识09——数据类型

哈喽&#xff0c;大家好啊&#xff0c;这里是雷工笔记&#xff0c;我是雷工。 数据类型比较常见&#xff0c;无论是对程序员&#xff0c;还是电气工程师来说&#xff0c;都再熟悉不过了&#xff0c;这里跟着教程了解一下&#xff0c;主要看跟自己以往在其他PLC&#xff0c;C#&a…

2023-09-09 LeetCode每日一题(课程表)

2023-09-09每日一题 一、题目编号 207. 课程表二、题目链接 点击跳转到题目位置 三、题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中…

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

python-jieba库

jieba库&#xff0c;python提供的中文分词函数库的第三方库&#xff0c;它可以将一段中文文本分割成中文词语序列。 安装jieba库 pip install jiebajieba的三个模式 全模式 - - - jieba.lcut(s,cut_allTrue) - - - 速度非常快&#xff0c;但有冗余数据 精确模式&#xff08;…

窗口延时、侧输出流数据处理

一 、 AllowedLateness API 延时关闭窗口 AllowedLateness 方法需要基于 WindowedStream 调用。AllowedLateness 需要设置一个延时时间&#xff0c;注意这个时间决定了窗口真正关闭的时间&#xff0c;而且是加上WaterMark的时间&#xff0c;例如 WaterMark的延时时间为2s&…

嵌入式开发-绪论

目录 一.什么是嵌入式 1.1硬件系统 1.2软件系统 二.嵌入式应用场景 2.1消费电子 2.1.1智能家居 2.1.2影音 2.1.3家用电器 2.1.4玩具游戏机 2.2通信领域 2.2.1对讲机 2.2.2手机 2.2.3卫星 2.2.4雷达 2.3控制领域 2.3.1机器人 2.3.2采集器PLC 2.4金融 2.4.1POS…

快速文件复制与删除工具,将复制时文件夹里的原文件删除掉

无论是工作还是生活&#xff0c;我们都离不开文件的复制和管理。然而&#xff0c;手动复制文件不仅费时费力&#xff0c;而且容易出错。现在&#xff0c;我们为您推荐一款快速文件复制与删除工具&#xff0c;让您的文件管理更加高效&#xff01; 首先&#xff0c;我们要进入文…

MybatisPlus分页插件使用

一. 效果展示 二. 代码编写 2.1 pom <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency>2.2 添加配置类 Configuration MapperScan(…

推荐一款程序员截图神器!

快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器&#xff0c;几乎每一个程序员都会设置开机自启&#xff0c;因为这个截图功能太太太好用了&#xff01;&#xff01;&#xff01;只要你在键盘上按下F1就可以轻松截取整个屏幕&#xff0c;然后…

51单片机项目(9)——基于51单片机的电子琴设计

简易电子琴设计设计内容: 1.用矩阵键盘代表琴键&#xff0c;至少能弹出8个音符&#xff0c;分别是:音符1.23.4.,5,6, 2.键按下的时间长短表征节拍的长短&#xff0c;用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 &#xff08;代码及其工程文件放在最后&#xff09; …

vue中的几种name属性

vue中的几种name属性 组件名name name选项 export default{name:xxx } // 获取组件的name属性 this.$options.namevue-devtools调试工具里显示的组件名称&#xff1b; 未配置name选项&#xff0c;就是组件的文件名&#xff1b; vue3配置name通过defineOptions()函数 de…

msvcp110.dll是什么意思与msvcp110.dll丢失的解决方法

电脑突然提示msvcp110.dll丢失&#xff0c;无法执行此代码。导致软件无法打开运行&#xff0c;这个怎么办呢&#xff1f;我在网上找了一天的资料&#xff0c;终于把这个问题彻底处理好&#xff0c;也弄清楚了msvcp110.dll丢失的原因及msvcp110.dll丢失修复方法&#xff1f;现在…

20230909java面经整理

1.java常用集合 ArrayList动态数组&#xff0c;动态调整大小&#xff0c;实现List接口 LinkedList双向链表&#xff0c;实现list和queue接口&#xff0c;适用于频繁插入和删除操作 HashSet无序&#xff0c;使用哈希表实现 TreeSet有序&#xff0c;使用红黑树实现 HashMap无序&…

FPGA开发

https://www.enclustra.com.cn/?bd_vid11435475462206745180 https://www.monolithicpower.cn/design-tools/design-tools/llc-design-tool.html https://www.elecfans.com/article/88/143/2012/20120718280641_2.html

[JAVAee]IP数据包的组包与分包

目录 数据包是什么? 数据包的结构 数据包/分组与分组交换 分包是什么?为什么需要分包呢? 组包是什么? 分包组包过程中和哪些 IP 报头字段有关联? 本篇文章主要围绕三个问题来展开: 为什么要分包?分包组包过程中和哪些 IP 报头字段有关联组包时如何保证数据的顺序和…

基于Yolov8的中国交通标志(CCTSDB)识别检测系统

目录 1.Yolov8介绍 2.纸箱破损数据集介绍 2.1数据集划分 2.2 通过voc_label.py得到适合yolov8训练需要的 2.3生成内容如下 3.训练结果分析 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&…

kafka学习-生产者

目录 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 自定义序列化器 4、分区器 默认分区规则 自定义分区器 5、生产者拦截器 作用 自定义拦截器 6、生产者原理解析 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 在Kafka中保存的数…

虚拟机上部署K8S集群

虚拟机上部署K8S集群 安装VM Ware安装Docker安装K8S集群安装kubeadm使用kubeadm引导集群 安装VM Ware 参考&#xff1a;http://www.taodudu.cc/news/show-2034573.html?actiononClick 安装Docker 参考&#xff1a;https://www.yuque.com/leifengyang/oncloud/mbvigg#2ASxH …

长安链BaaS服务平台调研

目录 一、菜单功能二、其他说明2.1、服务平台的部署方式2.2、链本身2.3、建链流程2.4、支持连接已部署的链2.5、链治理投票2.6、支持动态节点操作2.7、支持应用 长安链ChainMaker管理平台文档地址&#xff1a;https://docs.chainmaker.org.cn 一、菜单功能 菜单子菜单/功能点…