java写一个音乐播放程序,同时显示歌词
时间:2022-07-28
本文章向大家介绍java写一个音乐播放程序,同时显示歌词,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
java写一个音乐播放程序,同时显示歌词
总的来说分为两部分:1.音乐播放 2.显示歌词(这里介绍一个好理解的算法,就不进行优化了)
一、音乐播放(这里我们在网上先下载一个wav文件来播放)
这里我们使用eclipse软件进行编程。
- 首先,我们需要知道JDK原生只支持音频格式为*.wav *.au *.aiff 的音乐
- 如果我们不希望使用JDK原生支持,就需要自己使用jar包(下面代码我是使用JDK原生支持的播放器来写的)
- 注意一下我的两个资源,一个是邓紫棋泡沫的歌曲.wav,一个是邓紫棋画的歌.lrc(因为实在没找到邓紫棋画的wav文件就先对付上了…)
// JDK自带音乐播放无需导包
public static void MusicPlayer() {
try {
AudioPlayer.player.start(new FileInputStream(new File("./music/邓紫棋 - Paomo.wav")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二、显示歌词(这里我们先解析已有的lrc歌词文件,存放到data里面再进行操作)
public class Demo1 {
// 定义两个存放分钟和秒的数组
private static double[] d1 = new double[55];
private static double[] d2 = new double[55];
public static void main(String[] args) throws IOException {
// 读取lrc文件并转编码到 data4中
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("./data/画-邓紫棋.lrc"), "GBK"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("./data/data4.txt"), "UTF-8"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (String i = reader.readLine(); i != null; i = reader.readLine()) {
writer.write(i);
writer.newLine();
}
reader.close();
writer.close();
// 获取秒数组 d1[]
BufferedReader reader2 = new BufferedReader(new InputStreamReader(new FileInputStream("./data/data4.txt")));
int countLine = 0;
while ((reader2.readLine()) != null) {
countLine++;
if (countLine <= 4)
continue;
for (int i = 0; i < d1.length; i++) {
d1[i] = Double.parseDouble(reader2.readLine().substring(4, 9));
// System.out.println(d1[i]);
}
}
reader2.close();
// 获取分数组d2[]
BufferedReader reader3 = new BufferedReader(new InputStreamReader(new FileInputStream("./data/data4.txt")));
int countLine2 = 0;
while ((reader3.readLine()) != null) {
countLine2++;
if (countLine2 <= 4)
continue;
for (int i = 0; i < d2.length; i++) {
d2[i] = Double.parseDouble(reader3.readLine().substring(2, 3));
// System.out.println(d2[i]);
}
}
reader3.close();
// 歌词根据时间差输出到控制面板
BufferedReader reader4 = new BufferedReader(new InputStreamReader(new FileInputStream("./data/data4.txt")));
int countLine3 = 0;
while ((reader4.readLine()) != null) {
countLine3++;
if (countLine3 <= 4)
continue;
// 延迟判断
for (int i = 0; i < 55; i++) {
// 歌词
System.out.println(reader4.readLine().substring(10));
//时间差
double num1 = d1[i] * 1000 + d2[i] * 60 * 1000;
double num2 = d1[i + 1] * 1000 + d2[i + 1] * 60 * 1000;
long num3 = Math.round(num2 - num1);
try {
Thread.sleep(num3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
reader4.close();
}
}
三、完整代码
package com.qfedu.work;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import sun.audio.*;
public class Demo1 {
// 定义两个存放分钟和秒的数组
private static double[] d1 = new double[55];
private static double[] d2 = new double[55];
// JDK自带音乐播放无需导包
public static void MusicPlayer() {
try {
AudioPlayer.player.start(new FileInputStream(new File("./music/邓紫棋 - Paomo.wav")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
// 歌曲播放
MusicPlayer();
// 读取lrc文件并转编码到 data4中
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("./data/画-邓紫棋.lrc"), "GBK"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("./data/data4.txt"), "UTF-8"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (String i = reader.readLine(); i != null; i = reader.readLine()) {
writer.write(i);
writer.newLine();
}
reader.close();
writer.close();
// 获取秒数组 d1[]
BufferedReader reader2 = new BufferedReader(new InputStreamReader(new FileInputStream("./data/data4.txt")));
int countLine = 0;
while ((reader2.readLine()) != null) {
countLine++;
if (countLine <= 4)
continue;
for (int i = 0; i < d1.length; i++) {
d1[i] = Double.parseDouble(reader2.readLine().substring(4, 9));
// System.out.println(d1[i]);
}
}
reader2.close();
// 获取分数组d2[]
BufferedReader reader3 = new BufferedReader(new InputStreamReader(new FileInputStream("./data/data4.txt")));
int countLine2 = 0;
while ((reader3.readLine()) != null) {
countLine2++;
if (countLine2 <= 4)
continue;
for (int i = 0; i < d2.length; i++) {
d2[i] = Double.parseDouble(reader3.readLine().substring(2, 3));
// System.out.println(d2[i]);
}
}
reader3.close();
// 歌词根据时间差输出到控制面板
BufferedReader reader4 = new BufferedReader(new InputStreamReader(new FileInputStream("./data/data4.txt")));
int countLine3 = 0;
while ((reader4.readLine()) != null) {
countLine3++;
if (countLine3 <= 4)
continue;
// 延迟判断
for (int i = 0; i < 55; i++) {
// 歌词
System.out.println(reader4.readLine().substring(10));
//时间差
double num1 = d1[i] * 1000 + d2[i] * 60 * 1000;
double num2 = d1[i + 1] * 1000 + d2[i + 1] * 60 * 1000;
long num3 = Math.round(num2 - num1);
try {
Thread.sleep(num3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
reader4.close();
}
}
- HDUOJ------(1230)火星A+B
- nyoj-----前缀式计算
- HDUOJ----(4788)Hard Disk Drive
- NYOJ-------笨蛋难题四
- Win平台Web访问白名单设置脚本(IP安全性原则)
- NYOJ-------表达式求值
- HDUOJ----1181 变形课
- 正确的Win主机网站伪静态设置方法
- HDUOJ----(1084)What Is Your Grade?
- HDUOJ------(1272)小希的迷宫
- HDUOJ ---1269迷宫城堡
- HDUOJ---1213How Many Tables
- hduoj----(1033)Edge
- HDUOJ----(1031)Design T-Shirt
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- matplotlib绘图教程:设置标签与图例
- 企业是如何从头开发一个商业项目的?
- 基于Haproxy的高可用实战
- 组复制常规操作-分布式恢复 | 全方位认识 MySQL 8.0 Group Replication
- 赞!7000 字学习笔记,MySQL 从入到放弃
- 面试官问我Volatile的原理?从操作系统层面的设计怼回去!
- 设计原则之单一职责
- 设计原则之开闭原则
- SpringBoot执行跨域处理
- SpringBoot对全局异常的处理封装
- 自定义springboot-starter揭秘自动配置骚操作
- 【大厂面试题】Redis中是如何实现分布式锁的?
- 最近公司招人,研发组商量了下,暂时定下这么多java面试题!
- 市面上数据库种类那么多,如何选择?
- 玩转正则!推荐一个速查、调试、验证、可视化工具