java写一个音乐播放程序,同时显示歌词
发布日期:2021-10-12 20:08:09 浏览次数:2 分类:技术文章

本文共 5762 字,大约阅读时间需要 19 分钟。

java写一个音乐播放程序,同时显示歌词

总的来说分为两部分:1.音乐播放 2.显示歌词(这里介绍一个好理解的算法,就不进行优化了)

一、音乐播放(这里我们在网上先下载一个wav文件来播放)

这里我们使用eclipse软件进行编程。

  1. 首先,我们需要知道JDK原生只支持音频格式为*.wav *.au *.aiff 的音乐
  2. 如果我们不希望使用JDK原生支持,就需要自己使用jar包(下面代码我是使用JDK原生支持的播放器来写的)
  3. 注意一下我的两个资源,一个是邓紫棋泡沫的歌曲.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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:使用反射获取注解中的内容
下一篇:日历时间格式Date与Calender

发表评论

最新留言

很好
[***.229.124.182]2024年04月22日 00时12分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章