[英]Write mp3 file to disk while playing in Java
I have an application playing remote MP3 files over HTTP using the JLayer/BasicPlayer libraries. 我有一个应用程序,使用JLayer / BasicPlayer库通过HTTP播放远程MP3文件。 I want to save the played mp3 files to disk without re-downloading them.
我想将播放的mp3文件保存到磁盘,而无需重新下载它们。
This is the code using the JLayer based BasicPlayer for Playing the MP3 file. 这是使用基于JLayer的BasicPlayer播放MP3文件的代码。
String mp3Url = "http://ia600402.us.archive.org/6/items/Stockfinster.-DeadLinesutemos025/01_Push_Push.mp3";
URL url = new URL(mp3Url);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
BasicPlayer player = new BasicPlayer();
player.open(bis);
player.play();
How would I save the mp3 file to disk? 如何将mp3文件保存到磁盘?
To avoid having to go through the bytes twice, you need to wrap the input stream from the connection in a filter that writes any data that is read to an output stream, ie a kind of a "tee pipe input stream." 为避免两次遍历字节,您需要将来自连接的输入流包装在过滤器中,该过滤器会将读取的所有数据写入输出流,即一种“三通管道输入流”。 Such a class is not that difficult to write yourself, but you can save the work by using
TeeInputStream
from the Apache Commons IO library. 这样的类并不难编写,但是您可以通过使用Apache Commons IO库中的
TeeInputStream
来保存工作。
Apache Commons IO: http://commons.apache.org/io/ Apache Commons IO: http : //commons.apache.org/io/
TeeInputStream javadoc: http://commons.apache.org/io/apidocs/org/apache/commons/io/input/TeeInputStream.html TeeInputStream javadoc: http ://commons.apache.org/io/apidocs/org/apache/commons/io/input/TeeInputStream.html
Edit: Proof-of-concept: 编辑:概念验证:
import java.io.*;
public class TeeInputStream extends InputStream {
private InputStream in;
private OutputStream out;
public TeeInputStream(InputStream in, OutputStream branch) {
this.in=in;
this.out=branch;
}
public int read() throws IOException {
int read = in.read();
if (read != -1) out.write(read);
return read;
}
public void close() throws IOException {
in.close();
out.close();
}
}
How to use it: 如何使用它:
...
BufferedInputStream bis = new BufferedInputStream(is);
TeeInputStream tis = new TeeInputStream(bis,new FileOutputStream("test.mp3"));
BasicPlayer player = new BasicPlayer();
player.open(tis);
player.play();
BufferedInputStream in = new BufferedInputStream(is);
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(savePathAndFilename)));
byte[] buf = new byte[256];
int n = 0;
while ((n=in.read(buf))>=0) {
out.write(buf, 0, n);
}
out.flush();
out.close();
You can first write the stream to disk with FileInputStream
. 您可以首先使用
FileInputStream
将流写入磁盘。 Then reload the stream from file. 然后从文件重新加载流。
Wrap you own InputStream 包装你自己的InputStream
class myInputStream extends InputStream {
private InputStream is;
private FileOutputStream resFile;
public myInputStream(InputStream is) throws FileNotFoundException {
this.is = is;
resFile = new FileOutputStream("path_to_result_file");
}
@Override
public int read() throws IOException {
int b = is.read();
if (b != -1)
resFile.write(b);
return b;
}
@Override
public void close() {
try {
resFile.close();
} catch (IOException ex) {
}
try {
is.close();
} catch (IOException ex) {
}
}
}
and use 并使用
InputStream is = conn.getInputStream();
myInputStream myIs = new myInputStream(is);
BufferedInputStream bis = new BufferedInputStream(myIs);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.