如何使用java Servlet实现mp3流

时间:2012-02-27 05:16:47

标签: google-app-engine servlets mp3

目标:构建一个servlet,以便在浏览器中输入 http://xxx.com/servpage?a.mp3 时,我可以立即开始播放这个mp3文件。以前如果我把文件放在goDaddy上作为静态文件,我可以这样做。我的软件可以立即播放。

使用Servlet,我可以忽略后面的内容?,只想让这个页面动态返回mp3(因为将来我可能会返回任何其他文件)。我得到的是漫长的等待(> 20秒),然后让玩家玩它。

我按照一些例子,注意到示例中的“附件”。但是,如果我删除它,MP3将无法播放。我虽然使用了Google App Engine,但只需使用输入/输出流来返回http请求。有人可以帮忙吗?

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException ,IOException {
    res.setContentType("audio/mpeg3");
    OutputStream os = res.getOutputStream();
    res.setHeader("Content-Disposition", "attachment; filename="" + "a.mp3";");
    res.setContentLength(1000000);
    FileService fileService = FileServiceFactory.getFileService();
    boolean lockForRead = false;
    String filename =  "/gs/" + BUCKETNAME + "/" + FILENAME;
    AppEngineFile readableFile = new AppEngineFile(filename);

    try{
        FileReadChannel readChannel = fileService.openReadChannel(readableFile, lockForRead);
        InputStream is = Channels.newInputStream(readChannel);

        int BUFF_SIZE = 1024;
        byte[] buffer = new byte[BUFF_SIZE];
        try {
            do {
                int byteCount = is.read(buffer);
                if (byteCount == -1)
                    break;
                os.write(buffer, 0, byteCount);
                os.flush();
            } while (true);
        } catch (Exception excp) {
        } finally {
            os.close();
            is.close();
        }
        readChannel.close();
    } catch(Exception e){
    }
}

1 个答案:

答案 0 :(得分:2)

很少注意到:

  1. 你没有做“流媒体”。只是简单的文件下载。

  2. 要执行blob(文件)服务,您不需要像使用AppEngineFile一样从BlobStore读取blob。只需使用blobstoreService.serve(blobKey)直接投放即可。有关示例,请参阅Serving a Blob

  3. 您可以通过BlobKey获得2. {<1}}所需的fileService.getBlobKey(readableFile)

  4. <强>更新

    刚刚意识到您使用的是Google云端存储,而不是BlobStore。

    在GS中,如果正确设置了ACL,则可以通过以下方式公开显示文件:http://commondatastorage.googleapis.com/BUCKETNAME/FILENAME

    由于您没有进行任何身份验证,您可以在GS上公开共享该文件,然后在您的servlet中执行301重定向到该文件的公共URL。