2017-11-04 8 views
2

現在、JavaFX MediaPlayerでファイルを再生できるかどうかを確認する方法は、内部的に行われるためです。JavaFX MediaPlayerがファイルを再生できるかどうかを確認する正しい方法

import static com.sun.media.jfxmedia.MediaManager.canPlayContentType; 
import static com.sun.media.jfxmediaimpl.MediaUtils.filenameToContentType; 

public boolean isPlayable(String filename) { 
    return canPlayContentType(filenameToContentType(filename)); 
} 

これらのメソッドを含むパッケージは「APIではなく、Java 9ではアクセスできない」という問題があります。私は回避策があることを知っていますが、実際にこれを行う、将来的に正しい方法が正しいかどうか疑問です。

私はこの方法では、ディレクトリ内のすべての再生可能なコンテンツでライブラリを移入します:

Files.find(folderPath, Integer.MAX_VALUE, (path, attr) -> 
     attr.isRegularFile() && isPlayable(path.toFile().getName())) 
     .forEach(path -> addSong(path)); 

答えて

2

私はそのような組み込みのAPIを見つけるためにjavafx.mediaモジュールの文書化を経て、できませんでした1つを見つけるために。


多少あるfilenameToContentType(String filename)の既存の実装を見て、: -

if (extension.equals(FILE_TYPE_AIF) || extension.equals(FILE_TYPE_AIFF)) { 
    contentType = CONTENT_TYPE_AIFF; 
} else if ... other content types 

現在のファイル拡張子はthe supported container typeの一つであり、同じに基づいて、コンテンツタイプを返した場合、最終的にチェックします。

ボード上の他の部分は、NativeMediaManagerクラスに定義されているように最終的に各プラットフォームのsupportedContentTypesに依存していると思われるcanPlayContentType(String contentType)でした。主に、あなたが最終的に実行する予定のタスクの概要の無自覚に、以下の提案として、私は解決策をテストしていないものの


。しかし、あなたの現在の実装と何Basic PlayBack guidelinesにも示唆に最も近いが、

  • をしようとすると、提供されたファイル名のうち、Media instanceを構築しました。

  • (1)を実行している場合は、MediaExceptionを確認してください。


さらに、例外タイプMediaException.Type MEDIA_UNSUPPORTED

は、このメディアタイプは、このプラットフォームでサポートされていないことを示していることを述べています。

private static boolean isPlayable(String filename) { 
    try { 
     Media media = new Media(filename); 
    } catch (MediaException e) { 
     if (e.getType() == MediaException.Type.MEDIA_UNSUPPORTED) { 
      return false; 
     } 
    } 
    return true; 
} 

PS::私は実際にあなたの場合、これはさらに最適化することができ信じていますが、これと類推し、あなたの現在のソリューションから描画、あなたはおそらくこれを利用することができ

上記のスタブのように、コードをただちに削除するのではなく、そのコードの中にすぐに構築されたMediaを使用し始めます。

+1

ええ、私はすでに例外をキャッチすることがこれを処理するための好ましい方法であるとは思わないけれども、それについてもう少し考えました。今では、いくつかのインスタンスで最大40,000になるオブジェクトライブラリ全体を格納するので、ファイルオブジェクトまたはメディアオブジェクトのメモリフットプリントが大きいかどうかは疑問です。 – Xerus

+0

私は今大きな問題に遭遇しました。メディアオブジェクトは対応するファイルをロックします。その後に直接タグを読み取ることができなくなります。 – Xerus

+0

@Xerusは最終的な実装が何になったのかわかりません。それは別の質問です(間接的に関連する質問を避けるようにと頼んでいます)。 – nullpointer

関連する問題