【问题标题】:Stream music in loop over http using java使用java通过http循环播放音乐
【发布时间】:2012-11-21 02:14:34
【问题描述】:

我有一个自己编写的小型网络服务器,它能够处理 POST\GET 查询。另外,我有一个处理程序,它接收音频文件并将它们放入响应流中,如下所示:

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


}

现在它需要所有的音频文件并创建一个可靠的流。我希望它可以无限循环播放,就像网络上的小型广播电台一样。因此,当我的服务器运行时,我在浏览器中输入一个 url,它会循环播放目录中的音频文件。

编辑:

如果我的服务器有所需的字节,我如何循环播放这些字节,例如在 VLC 播放器中? 我的意思是它只会播放一次流,但我怎么能循环呢?

【问题讨论】:

    标签: java http audio stream


    【解决方案1】:

    您好康斯坦丁,我认为了解渐进式下载和流媒体here 之间的区别很重要。 您所做的根本不是流式传输,而是渐进式下载,也就是说,如果您想在流式传输中跳转到文件的那一部分(例如 You Tube),则必须先下载,这不是必需的,您可以收听无休止地听它(例如 BBC 电台)

    我建议你查看你对流媒体感兴趣的 red5 服务器项目。

    如果您想继续使用当前的代码(渐进式),也许您应该创建一个永无止境的输出流并不时暂停以限制下载速度。

    我希望这会有所帮助!

    【讨论】:

    • 好的,谢谢!但是,如果我创建一个 unendung 输出流,那不会造成内存问题吗?我的意思是,我可以把所有的东西都放在输出流中,但是我必须设置响应头,而且内存是有限的。
    • 可能,但老实说,我不知道限制是什么。我已经成功完成了最多 1GB 的 .flv 文件,没有任何麻烦。
    • @PbxMan 您在答案中提供的链接现在无效。请更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多