java写一个音乐播放程序,同时显示歌词
发布日期:2021-10-12 20:08:09
浏览次数:2
分类:技术文章
本文共 5762 字,大约阅读时间需要 19 分钟。
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(); }}
转载地址:https://blog.csdn.net/qq_39773004/article/details/104652425 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月22日 00时12分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OpenStack 虚拟机冷/热迁移功能实践与流程分析
2019-04-27
Libvirt Live Migration 与 Pre-Copy 实现原理
2019-04-27
OpenStack 虚拟机的磁盘文件类型与存储方式
2019-04-27
OpenStack 虚拟机冷/热迁移的实现原理与代码分析
2019-04-27
Amphorae 与 Octavia Worker 的安全通信实现
2019-04-27
计算机组成原理 — 输入输出系统
2019-04-27
系统学英语 —语法— 句子成分
2019-04-27
计算机组成原理 — FPGA 现场可编程门阵列
2019-04-27
虚拟化技术实现 — QEMU-KVM & Libvirt
2019-04-27
C类型强转的理解
2019-04-27
设置DPI缩放等,wxpython高分辨率下模糊的问题处理
2019-04-27
内存映射文件的优势劣势体会
2019-04-27
关于window网络共享到linux主机的步骤与注意事项
2019-04-27
记录一个Union和使用指针直接强转读取数据的例子
2019-04-27
为什么python的默认参数只初始化一次
2019-04-27
python充分利用多核的方式
2019-04-27
远程调用pkill 之后的命令无法生效的问题
2019-04-27
Pkg打包nodejs程序过程中遇到的问题与处理
2019-04-27