我正在使用vlcj 4.8.0制作一个音乐播放器,并希望实现其MediaDiscovery组件来查找包含音频文件的目录(在本地音乐文件夹中).到目前为止,我一直使用DirectoryChooser和file.listFiles(File::isDirectory)
来获取它们,但我认为让MediaDiscoverer来处理这个功能会更实用.
我对this example from vlcj's examples repository做了一些修改,只获得包含音乐文件的目录.
public class MediaDiscovererTest {
private static final List<String> musicDirectories = new ArrayList<>();
public static void main(String[] args) throws Exception {
MediaPlayerFactory factory = new MediaPlayerFactory();
List<MediaDiscovererDescription> discoverers = factory.mediaDiscoverers().discoverers(MediaDiscovererCategory.LOCAL_DIRS);
if (discoverers.isEmpty()) {
return;
}
Iterator<MediaDiscovererDescription> iterator = discoverers.iterator();
while (iterator.hasNext()) {
MediaDiscovererDescription discoverer = iterator.next();
if (discoverer.name().equals("picture_dir") || discoverer.name().equals("video_dir")) {
iterator.remove(); // as I'm only interested in audio directories
}
}
for (MediaDiscovererDescription description : discoverers) {
final String name = description.name();
MediaDiscoverer discoverer = factory.mediaDiscoverers().discoverer(name);
MediaList list = discoverer.newMediaList();
MediaListEventAdapter mediaListEventAdapter = new MediaListEventAdapter() {
@Override
public void mediaListItemAdded(MediaList mediaList, MediaRef item, int index) {
Media newMedia = item.newMedia();
System.out.println(newMedia.info().mrl());
// Adding a new directory to the list
musicDirectories.add(newMedia.info().mrl());
newMedia.release();
}
};
list.events().addMediaListEventListener(mediaListEventAdapter);
discoverer.start();
// list.events().removeMediaListEventListener(mediaListEventAdapter);
// discoverer.release();
// list.release();
}
System.out.println(musicDirectories.size()); // <- In this test's current state, this will always be 0
Thread.currentThread().join();
}
}
每当将新项目合并到MediaList中时,它的路径都会打印到控制台并保存到musicDirecters.这可以达到预期的效果.然而,我不清楚如何监测发现过程的进展.具体地说,我想确定它何时结束,这样我就可以确保我的程序只有在发现过程完成后才能继续进行.
在处理类似的过程时,如解析Media,这是一个异步操作,通过将MediaEventListener附加到MediaPlayer,可以知道解析何时完成:
mediaPlayer.events().addMediaEventListener(new MediaEventListener() {
@Override
public void mediaParsedChanged(Media media, MediaParsedStatus newStatus) {
if (newStatus == MediaParsedStatus.DONE) {
// Do something
}
}
});
遗憾的是,我不确定如何为MediaDiscoverer实现这样的方法,因为我已经阅读了它的文档,但找不到任何类似的东西.我有discovered的唯一基本解决方案是在discoverer.start();
之后立即使用Thread.sleep(2000),但这显然不是一个理想的方法.是否有更可靠的方法来确定发现过程何时完成?