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 を静的 Web フォルダーに移動すると、Safari モバイル ブラウザーで再生できます。

JAX-RS を使用して返されたオーディオをモバイル Safari で再生するにはどうすればよいですか?

4

2 に答える 2

1

AudioAttributesおよびクラスを使用しEncodingAttributesて、ファイルを適切なコーデックに変換しました。曲を再生するたびに新しいファイルを作成する必要があるため、かなり遅く、多くのストレージを浪費します。変換後にファイルがキャッシュされるように、後でこのコードを変更する可能性があります。次に、変換する前に、すでに変換したかどうかを確認します。また、変換する前に、rawファイルがデバイスと互換性があるかどうかをテストすると便利です。これが現在のコードです。

    @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

問題の根本的な原因が何であるかを明確にしていただけますか? ファイルを再エンコードすると問題が解決する理由がよくわかりません。私が理解したことから、静的に提供される場合はSafariモバイルで正常に機能する.mp3がありますが、上記のコードに従って提供される場合はそうではありません。したがって、元の .mp3 は iOS が処理できる方法でエンコードされていると思います (そうしないと、静的に提供されたファイルが正しく再生されません)。

提供された .mp3 と一緒に送信しているヘッダーに問題がある可能性はありますか? 私が尋ねる理由は、Perl スクリプトによって提供される mp3 をモバイル Safari に提供する際に同様の問題があるためです。ファイルが静的に提供されている場合は正常に機能します。Perl を使用して同じファイルを提供すると、Safari モバイルで 404 が返されます (OSX の Safari は正常に動作します)。

于 2013-10-01T13:09:15.060 に答える