10

次のコードを使用して、JavaFXメディアプレーヤーを使用してmp3ファイルを再生しています

 new MediaPlayer(new Media(FileObject.toURI().toString())).play();

ただし、ファイル オブジェクトではなく、mp3 バイト データをメモリに格納する必要があります。その理由は、mp3 ファイルが暗号化されてから、プログラムと共に出荷されるためです。したがって、メモリまたは入力ストリームで mp3 ファイルを復号化する必要があります。

mp3 ファイルを一時ディレクトリの一時ファイルに復号化できますが、これはパフォーマンスのオーバーヘッドとなり、オーディオ コンテンツは安全ではなくなります。

4

2 に答える 2

2

Media Javadocから

HTTP、FILE、および JAR URL のみがサポートされています。指定された URL が無効な場合、例外がスローされます。非同期エラーが発生した場合、エラー プロパティが設定されます。このプロパティをリッスンして、そのようなエラーが通知されるようにします。

私は個人的にJavaFXに精通していませんが、厄介なハックに頼らなければ、メディアをメモリから直接読み取ることができないことを示唆しています. 通常、この種の URI のみのインターフェイスでは、カスタムUrlStreamHandlerとメモリから読み取るカスタム プロトコルを登録することをお勧めします。ただし、JavaDoc が正しいと仮定すると、JavaFX は独自の解像度を使用するため、おそらくこれは機能しません。

これを考えると、これを機能させる唯一の方法は、HTTP 経由でインメモリ MP3 へのアクセスを提供することだと思います。これは、 Jettyまたは同様の組み込み可能なサーブレット コンテナーを使用して行うことができます。次の行に沿ったもの:

1)クイック スタート ガイドに従って Jetty を起動します。

2) 以下のようなサーブレットを登録します。このサーブレットは、メモリ内データを公開します。

public class MagicAccessServlet extends HttpServlet {
    private static final Map<String, byte[]> mediaMap = new ConcurrentHashMap();

    public static String registerMedia(byte[] media) {
        String key = UUID.randomUUID().toString();
        mediaMap.put(key, media);
        return key;
    }

    public static deregisterMedia(String key) {
        mediaMap.remove(key);
    }

    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        String key = req.get("key");
        byte[] media = mediaMap.get(key);
        resp.setContentLength(media.length);
        resp.getOutputStream().write(media);
    }
}

次に、http url を使用してアプリケーション内からアクセスできます。たとえば、次のようなもの

MagicAccessServlet.registerMedia(decodedMp3);
new MediaPlayer(new Media("http://localhost:<port>/<context>/<servlet>?key=" + key)).play();    
于 2012-11-24T09:36:12.050 に答える
0

残念ながら、Mediaコンストラクターが立っているので、一時ファイルアプローチ以外にこれを行う簡単な方法はありません。パフォーマンスにオーバーヘッドがあることに同意しますが、ファイルが大きすぎない場合(ほとんどのmp3ファイルは一般的にそうではありません)、この意味でオーバーヘッドは最小限に抑えられるはずです。また、技術的には、コンテンツをメモリにデコードすると、コンテンツが安全でなくなります(ただし、抽出がはるかに困難になります)。

私が考えた少しクレイジーなアプローチの1つは、ソケットを使用することでした。暗号化されていないコンテンツを復号化し、ローカルホストの特定のポートを介して生のmp3バイトをストリーミングするアプリケーションの別の部分をセットアップできます。次に、これをHTTPURIとしてMediaコンストラクターに提供できます。

于 2012-11-24T09:23:08.890 に答える