当前位置: 首页 > 知识库问答 >
问题:

在Java中,当另一个音频文件开始使用key_events时,如何停止前一个音频文件

宇文飞翮
2023-03-14

我知道这个片段。stop()方法,但是当我把它放在key_events中时,它似乎在里面不起作用。它只会导致错误。我知道为什么它会导致错误。因为我要求它基本上停止一个直到几行之后才存在的剪辑。但是,如果可能的话,使用相同的逻辑或接近它,我怎么能重新编码,这样它就知道选择从上一个key_event播放的上一个剪辑。我想要的功能是:按下F1键时,会播放wav。按下F2时,当前波形停止,新波形开始。按下F3时,当前波形停止,新波形开始。等等。

            case KeyEvent.VK_F1:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;


            case KeyEvent.VK_F2:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename2));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;

            case KeyEvent.VK_F3:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename3));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;

            case KeyEvent.VK_F4:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename4));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;

            case KeyEvent.VK_F5:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename5));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;

            case KeyEvent.VK_F6:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename6));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;

            case KeyEvent.VK_F7:

                try {

                    //stop any sound
                    clip.stop();

                    sample = AudioSystem.getAudioInputStream(getURL(filename7));

                    //create a sound buffer
                    Clip clip = AudioSystem.getClip();

                    //load the audio file
                    clip.open(sample);

                    //play sample
                    clip.start();

                } catch (MalformedURLException ez) {
                } catch (IOException ez) {
                } catch (LineUnavailableException ez) {
                } catch (UnsupportedAudioFileException ez) {
                } catch (Exception ez) { }

                break;

任何帮助都将不胜感激:)谢谢

共有1个答案

施同
2023-03-14

很难 100% 确定,但看起来你正在掩盖你的变量......

clip.stop();

sample = AudioSystem.getAudioInputStream(getURL(filename));

//create a sound buffer
Clip clip = AudioSystem.getClip();

事实上,我甚至不确定这将如何编译...

Clip定义为实例变量,当程序初始化时,同时初始化Clip

您应该可以随时调用停止,但这只会将Clip重置回当前输入的开头。您还需要做的是关闭Clip,这会释放由Clip管理的内部资源,用于当前输入…

KeyListener也是出了名的麻烦,您应该考虑使用键绑定,因为它们为您提供了确定键事件可以生成的焦点级别的控制,例如…

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestPlayer {

    public static void main(String[] args) {
        new TestPlayer();
    }

    public TestPlayer() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                try {
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (LineUnavailableException exp) {
                    exp.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {

        private Clip clip;
        private List<File> playList;
        private int index;

        private JLabel label;

        public TestPane() throws LineUnavailableException {
            label = new JLabel("Play stuff");
            add(label);
            clip = AudioSystem.getClip();

            File[] files = new File("A folder of music files").listFiles(new FileFilter() {
                @Override
                public boolean accept(File file) {
                    return file.getName().toLowerCase().endsWith(".wav");
                }
            });
            playList = new ArrayList<>(Arrays.asList(files));
            index = -1;

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "previous");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "next");

            ActionMap am = getActionMap();
            am.put("next", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    playNext();
                }
            });
            am.put("previous", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    playPrevious();
                }
            });
        }

        public void playNext() {
            index++;
            if (index >= playList.size()) {
                index = 0;
            }

            File file = playList.get(index);

            play(file);
        }

        public void playPrevious() {
            index--;
            if (index < 0) {
                index = playList.size() - 1;
            }

            File file = playList.get(index);

            play(file);
        }

        public void play(File file) {

            try {
                stop();
                label.setText(file.getName());
                AudioInputStream sample = AudioSystem.getAudioInputStream(file);
                clip.open(sample);
                clip.start();
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException exp) {
                exp.printStackTrace();
            }
        }

        public void stop() {

            clip.stop();
            clip.close();

        }

    }

}
 类似资料:
  • 我想得到两个音频文件作为输入,然后按字节合并它们,并将其保存为单个文件。 在这个代码中,我试图在Java中做到这一点,它工作正常,但我不知道如何在android中做到这一点。 如何在Android系统中做到这一点?

  • 我正在尝试使用FFMPEG合并2个mp4文件。其中一个文件同时具有视频和音频(),而另一个只有音频()。这些文件的名称以以下方式列在名为的文本文件中: 然后执行下面的ffmpeg命令来合并它们。 但是,生成的连接文件只包含。也就是说,如果

  • 问题内容: 我想使用Xuggler 将无音频的视频文件与音频文件合并。此刻,我已经采取了两个流,并将这些流的视频和音频部分分别合并为画中画。现在,我想将音频和视频文件相互组合。任何建议或提示将不胜感激。我正在使用red5服务器。谢谢。 问题答案: 使用MediaConcatenator。请参见示例代码“连接音频和视频”

  • 我正在使用媒体播放器播放带有列表视图的原始文件夹中的音频文件。一切正常,但我有一个问题。 问题是:当第一个音频文件结束时,它播放第二个文件,但当第二个文件结束时,它不播放第三个文件。 问题是什么??我尝试在mp上添加setOnCompletionListener并重置mp并在(位置+1)中播放audion,这是真的吗? 我还有一个问题。当它结束播放listview中的第一个项目并开始播放第二个项目

  • 我的应用程序中有一项服务。它发送和接收webservice请求和响应。当我收到来自web服务的特定响应时,我需要停止播放音频/视频文件(媒体文件正在从另一个应用程序播放)。当我完成某个过程时,我需要再次恢复。 注: 在andoid设备中,如果任何2G呼叫停止播放媒体文件,则音乐播放器播放任何音乐,然后当2G呼叫断开时,停止播放媒体文件。我只需要这样做。

  • 如何让音频文件连续重复?现在音乐只播放一次,就是这样。我试图让声音一遍又一遍地重复。我是否必须以另一种方式获取音频文件,或者有更简单的方法? 代码: 我怎么称呼它: