1

POST\GET クエリを処理できる小さな自己記述 Web サーバーがあります。また、次のように、オーディオ ファイルを受信して​​応答ストリームに配置する Handler があります。

package com.skynetwork.player.server;

import ...

public class Server {
private static Logger log = Logger.getLogger(Server.class);
//Here goes the handler.
static class MyHandler implements HttpHandler {
    private String testUrl = "D:\\test";
    private ArrayList<File> urls = new ArrayList<File>();

    private long calculateBytes(ArrayList<File> urls) throws IOException {
        long bytes = 0;
        for (File url : urls) {
            bytes += FileUtils.readFileToByteArray(url).length;
        }
        return bytes;
    }

    public void handle(HttpExchange t) throws IOException {
        File dir = new File (testUrl);
        System.out.println(dir.getAbsolutePath());
        if (dir.isDirectory()) {
            log.info("Chosen directory:" + dir);
            Iterator<File> allFiles = (FileUtils.iterateFiles(dir, new String[] {"mp3"}, true));
            while (allFiles.hasNext()) {
                File mp3 = (File)allFiles.next();
                if (mp3.exists()) {
                    urls.add(mp3);
                    log.info("File " + mp3.getName() + " was added to playlist.");
                }
            }                       
        } else {
            log.info("This is not a directory, but a file you chose.");
            System.exit(0);
        }

        t.sendResponseHeaders(200, calculateBytes(urls));
        OutputStream os = t.getResponseBody();
        for (File url : urls) {
            os.write(FileUtils.readFileToByteArray(url));
        }
        os.close();
    }
}

public static void main(String[] args) throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

    server.createContext("/test", new MyHandler());
    server.setExecutor(null); 
    server.start();
}


}

現時点では、すべてのオーディオ ファイルを取得して、1 つのソリッド ストリームを作成します。ウェブ上の小さなラジオ局のように、無限にループ再生してほしいです。そのため、サーバーの実行中にブラウザに URL を入力すると、ディレクトリからオーディオ ファイルがループ再生されます。

編集:

サーバーに必要なバイトがある場合、VLC Player などでこれらのバイトをループで再生するにはどうすればよいですか? ストリームを一度だけ再生するということですが、どうすればループできますか?

4

1 に答える 1

3

こんにちはコンスタンティン私はここでプログレッシブダウンロードとストリーミングの違いを理解することが重要だと思います。あなたがしているのはストリーミングではなくプログレッシブダウンロードです。つまり、ストリーミング中にファイルのその部分(YouTubeなど)にジャンプしたい場合は、最初にダウンロードする必要があります。これは不要で、聞くことができます。延々とそれに(例:BBCラジオ)

ストリーミングに興味のあるred5サーバープロジェクトをチェックすることをお勧めします。

現在のコード(プログレッシブ)を続行したい場合は、終わりのない出力ストリームを作成し、時々一時停止してダウンロード速度を制限する必要があります。

これがお役に立てば幸いです。

于 2012-12-03T16:16:57.777 に答える