如何正确将路径传递给MediaPlayer(错误java.net.URISyntaxException)

问题描述 投票:0回答:1

我想在按下按钮时播放mp3文件,所以我创建了一个按钮,用于创建音频播放器,这显然需要一个源。我试图通过Path或URI传递源,但是它不起作用,我将始终收到相同的错误(URISyntaxException)。我这样初始化按钮:

public class GUI
{
    private String localFolder=System.getProperty("user.dir");
    // I'm taking the actual folder where my app is executed

    private void audioInitialize()  {
        localFolder+=File.pathSeparator+"src"+File.pathSeparator+"InUse"+File.pathSeparator;
        File saves=new File(localFolder);  // need the path for other use
        AudioButton button0=new AudioButton("SONG", saves.getPath()+File.pathSeparator+"song.mp3", true);
        buttons.add(button0);
        /*
        *
        *
        */
}

这是我的AudioButton类:

public class AudioButton extends JButton implements ActionListener
{
    private String uri;
    private final boolean isCustom;
    public AudioButton(String label, String uri, boolean isCustom)  {
        this.uri=uri;
        this.isCustom=isCustom;
        this.setText(label);
        this.setBackground(new Color(205, 205, 205));
        this.setBorderPainted(true);
        this.addActionListener(this);
    }
    public String getUri()  {return this.uri;}
    public boolean isCustom()   {return this.isCustom;}
    @Override
    public void actionPerformed(ActionEvent e)
    {
        AudioPlayer player=new AudioPlayer(this.uri);
        player.getPlayer().play();
    }
}

有AudioPlayer:

public class AudioPlayer extends JPanel
{
    private final String uri;
    private Media media;
    private MediaPlayer mediaPlayer;
    public AudioPlayer(String uri)  {
        @SuppressWarnings("unused")
        JFXPanel pane=new JFXPanel();
        this.uri=uri;
        media=new Media(uri);
        mediaPlayer=new MediaPlayer(media);
    }
    public MediaPlayer getPlayer()  {return this.mediaPlayer;
}

这是控制台输出:

Picked up _JAVA_OPTIONS: -Xmx512M
C:\Users\myUser\eclipse-workspace\Folder\src\InUse
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in opaque part at index 2: C:\Users\myUser\eclipse-workspace\Folder\src\InUse\song.mp3
    at javafx.media/javafx.scene.media.Media.<init>(Media.java:385)
    at projectName.AudioPlayer.<init>(AudioPlayer.java:18)
    at projectName.AudioButton.actionPerformed(AudioButton.java:27)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:269)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6578)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3343)
    at java.desktop/java.awt.Component.processEvent(Component.java:6343)
    at java.desktop/java.awt.Container.processEvent(Container.java:2259)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4961)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2317)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4539)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4480)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2303)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2758)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:766)
    at java.desktop/java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:717)
    at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:711)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:99)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:739)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:737)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:736)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:199)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.net.URISyntaxException: Illegal character in opaque part at index 2: C:\Users\myUser\eclipse-workspace\Folder\src\InUse\song.mp3
    at java.base/java.net.URI$Parser.fail(URI.java:2912)
    at java.base/java.net.URI$Parser.checkChars(URI.java:3083)
    at java.base/java.net.URI$Parser.parse(URI.java:3119)
    at java.base/java.net.URI.<init>(URI.java:598)
    at javafx.media/javafx.scene.media.Media.<init>(Media.java:383)
    ... 38 more

我该如何解决此问题?

java audio path uri
1个回答
0
投票

[找出问题的解决方法:在AudioPlayer中,在创建Media对象时,应为构造函数提供一个文件uri作为字符串(可能是,否则会产生解析问题,从错误中我可以理解):

 public AudioPlayer(String uri)  {
        @SuppressWarnings("unused")
        JFXPanel pane=new JFXPanel();
        this.uri=uri;
        media=new Media(new File(uri).toUri().toString()); // giving the uri of a new file as a string
        mediaPlayer=new MediaPlayer(media);
    }
© www.soinside.com 2019 - 2024. All rights reserved.