package lrc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class PlayLrc {
public final Pattern pattern = Pattern.compile("(?<=//[).*?(?=//])");
public AudioInputStream inputStream;
public SourceDataLine dataLine;
public AudioFormat fileFormat;
public ArrayList lrc = new ArrayList();
public void readFile() {
File file = new File("D://workspace//Learn//src//lrc//song.lrc");
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(
fis));
String lrcString = null;
while ((lrcString = reader.readLine()) != null)
parseLine(lrcString);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private long strToLong(String timeStr) {
String[] s = timeStr.split(":");
int min = Integer.parseInt(s[0]);
String[] ss = s[1].split("//.");
int sec = Integer.parseInt(ss[0]);
int mill = Integer.parseInt(ss[1]);
return min * 60 * 1000 + sec * 1000 + mill * 10;
}
public void readMp3() {
System.out.println("----------play music----------");
File file = new File("D://workspace//Learn//src//lrc//xgfzj.wav");
try {
inputStream = AudioSystem.getAudioInputStream(file);
fileFormat = inputStream.getFormat();
if (fileFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
AudioFormat newFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
fileFormat.getSampleRate(), 16,
fileFormat.getChannels(), fileFormat.getChannels() * 2,
fileFormat.getSampleRate(), false);
System.out.println("Converting audio format to " + newFormat);
AudioInputStream newStream = AudioSystem.getAudioInputStream(
newFormat, inputStream);
fileFormat = newFormat;
inputStream = newStream;
}
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
fileFormat);
dataLine = (SourceDataLine) AudioSystem.getLine(info);
dataLine.open(fileFormat, dataLine.getBufferSize());
dataLine.start();
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
int index = 1;
boolean mark = false;
while (true) {
long time = dataLine.getMicrosecondPosition() / 1000;
if (time < lrc.get(index).getTime()) {
if (!mark)
System.out.println(lrc.get(index - 1).getStr());
mark = true;
} else {
index++;
mark = false;
}
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
int bufferSize = (int) fileFormat.getSampleRate()
* fileFormat.getFrameSize();
byte[] buffer = new byte[bufferSize];
int bytesRead = 0;
while (bytesRead >= 0) {
bytesRead = inputStream.read(buffer, 0, buffer.length);
if (bytesRead >= 0) {
dataLine.write(buffer, 0, bytesRead);
}
}
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void parseLine(String line) {
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
String time = matcher.group();
String str = line.substring(line.indexOf(time) + time.length() + 1);
Code code = new Code(strToLong(time), str);
lrc.add(code);
// System.out.println(code.getTime() + "/t" + code.getStr());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
PlayLrc playLrc = new PlayLrc();
playLrc.readFile();
playLrc.readMp3();
}
class Code {
private long time;
private String str;
public Code(long time, String str) {
setTime(time);
setStr(str);
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
}
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2299
- 用户1336
- 访客10619057
每日一句
You leave, or I go with you.
你留下,或者我跟你走。——《海角七号》
你留下,或者我跟你走。——《海角七号》
新会员