1

我在使用此代码时遇到问题,

@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 移动到静态网络文件夹时,它可以在 Safari 移动浏览器中播放。

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

4

2 回答 2

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();
    }
于 2013-03-16T20:27:05.823 回答
0

你能澄清一下你的问题的根本原因是什么吗?我不太明白为什么重新编码文件应该解决问题?据我了解,您有一个 .mp3 在静态服务时在 Safari 移动设备中运行良好,但在按照您的上述代码提供时却不行。因此,我认为您的原始 .mp3 是以 iOS 可以处理的方式编码的(否则静态提供的文件将无法正确播放)。

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

于 2013-10-01T13:09:15.060 回答