使用Jersey在Java中为移动Safari浏览器提供mp3

时间:2012-09-09 19:29:15

标签: java mobile-safari jax-rs audio-streaming html5-audio

我遇到了这段代码的问题,

@Path("/play")
public class Player {

    @GET
    @Produces("audio/mpeg")
    public Response get(@DefaultValue("C:\\Users\\Ben\\Music\\sample.mp3") @QueryParam("file") String file) {
        File song = new File(file);
        return Response.ok().entity(song).build();
    }
}

Chrome可以播放从此处返回的内容,但Safari移动设备无法播放。

当我将sample.mp3移动到静态Web文件夹时,它可以在Safari移动浏览器中播放。

如何让移动版Safari播放使用JAX-RS返回的音频?

2 个答案:

答案 0 :(得分:1)

我使用AudioAttributesEncodingAttributes类将文件转换为正确的编解码器。它非常慢并且浪费了大量存储空间,因为每次播放歌曲时都必须创建一个新文件。我稍后可能会更改此代码,以便在转换后缓存文件。然后在我转换之前,检查我是否已经转换。在转换之前测试原始文件是否与设备兼容也是很好的。这是当前的代码。

    @GET
    @Path("/audio")
    @Produces("audio/mpeg")
    public Response getAudio(
            @DefaultValue("C:\\Users\\Ben\\Music\\sample.mp3") @QueryParam("file") String file,
            @DefaultValue("medium") @QueryParam("quality") String quality) throws EncoderException, IOException {
        File song = new File(file);
        File rootMusicDir = new File(AUDIO_PATH);
        File rootVideoDir = new File(VIDEO_PATH);
        if (!directoryService.isSubDirectory(rootMusicDir, song) && !directoryService.isSubDirectory(rootVideoDir, song)) {
            return Response.status(500).build();
        }

        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        if (quality.equalsIgnoreCase("high")) {
            audio.setBitRate(new Integer(256000));
            audio.setChannels(new Integer(2));
            audio.setSamplingRate(new Integer(44100));
        } else if (quality.equalsIgnoreCase("medium")) {
            audio.setBitRate(new Integer(128000));
            audio.setChannels(new Integer(2));
            audio.setSamplingRate(new Integer(44100));
        } else {
            audio.setBitRate(new Integer(64000));
            audio.setChannels(new Integer(1));
            audio.setSamplingRate(new Integer(22050));
        }

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();

        String random = new BigInteger(130, new SecureRandom()).toString(32);
        File songMP4 = new File(TEMP_PATH + file.replaceAll("[^\\dA-Za-z ]", "").replaceAll("\\s+", "+") + random);
        encoder.encode(song, songMP4, attrs);
        return Response.ok().entity(songMP4).build();
    }

答案 1 :(得分:0)

您能否澄清问题的根本原因是什么?我不太关注为什么重新编码文件应该解决问题?根据我的理解,你有一个.mp3在静态服务时可以在Safari手机中正常工作,但不能按照上面的代码服务。因此,我认为你的原始.mp3是以iOS可以处理的方式编码的(否则静态服务的文件将无法正常播放)。

您与服务的.mp3一起发送的标头是否存在问题?我问的原因是我有一个类似的问题,服务于移动Safari,由Perl脚本提供服务。在静态提供文件时工作正常。当使用Perl提供相同的文件时,它在Safari移动设备中提供404(OSX上的Safari工作正常)。