1

JLayer/BasicPlayer ライブラリを使用して HTTP 経由でリモート MP3 ファイルを再生するアプリケーションがあります。再生した mp3 ファイルを再ダウンロードせずにディスクに保存したい。

これは、MP3 ファイルを再生するために JLayer ベースの BasicPlayer を使用するコードです。

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

mp3 ファイルをディスクに保存するにはどうすればよいですか?

4

4 に答える 4

3

バイトを2回通過する必要がないようにするには、接続からの入力ストリームを、読み取られたデータを出力ストリーム、つまり一種の「ティーパイプ入力ストリーム」に書き込むフィルターでラップする必要があります。このようなクラスを自分で作成するのはそれほど難しくありませんが、TeeInputStreamApacheCommonsIOライブラリからを使用して作業を保存できます。

Apache Commons IO:http:
//commons.apache.org/io/ TeeInputStream javadoc:http ://commons.apache.org/io/apidocs/org/apache/commons/io/input/TeeInputStream.html

編集:概念実証:

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

それの使い方:

...
BufferedInputStream bis = new BufferedInputStream(is);
TeeInputStream tis = new TeeInputStream(bis,new FileOutputStream("test.mp3"));

BasicPlayer player = new BasicPlayer();
player.open(tis);
player.play();
于 2012-02-15T08:21:49.783 に答える
0
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();  
于 2012-02-15T08:18:43.593 に答える
0

最初に、を使用してストリームをディスクに書き込むことができますFileInputStream。次に、ファイルからストリームをリロードします。

于 2012-02-15T08:19:37.663 に答える
0

独自の 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) {
        }
    }
}

そして使う

InputStream is = conn.getInputStream();
myInputStream myIs = new myInputStream(is);
BufferedInputStream bis = new BufferedInputStream(myIs);
于 2012-02-15T08:35:46.427 に答える