我遇到了这段代码的问题,
@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返回的音频?
答案 0 :(得分:1)
我使用AudioAttributes
和EncodingAttributes
类将文件转换为正确的编解码器。它非常慢并且浪费了大量存储空间,因为每次播放歌曲时都必须创建一个新文件。我稍后可能会更改此代码,以便在转换后缓存文件。然后在我转换之前,检查我是否已经转换。在转换之前测试原始文件是否与设备兼容也是很好的。这是当前的代码。
@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工作正常)。