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

时间:2022-07-28
本文章向大家介绍java写一个音乐播放程序,同时显示歌词,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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();

	}
}