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

2023-12-08

我知道 Clip.stop() 方法,但是当我将它放在 key_events 中时它似乎不起作用。它只会导致错误。好吧,我知道为什么会导致错误。因为我要求它基本上停止几行之后才存在的剪辑。但是使用相同的逻辑或接近它(如果可能),我如何重新编码,以便它知道选择从上一个 key_event 播放的上一个剪辑。我想要的功能是:当按下 F1 时,会播放 wav 音乐。当按下 F2 时,当前的 wav 停止,新的 wav 开始。当按下 F3 时,当前的 wav 停止,新的 wav 开始。等等等等等等。

            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;

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


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

clip.stop();

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

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

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

Define Clip作为实例变量,当程序初始化时,初始化Clip同时。

你应该可以打电话stop任何时候,但这只会重置Clip返回到当前输入的开头。您还需要做的是关闭Clip,这会释放由该管理器管理的内部资源Clip对于当前输入...

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

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();

        }

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何在 Android 上启用 cmake 的剥离

    我们正在开发一个带有原生部分的 Android 库 我们主要是 Java 开发人员 而不是 C 开发人员 我们的一点点 C 经验足以编写我们需要的本机代码 但我们在剥离方面遇到了意想不到的麻烦 这与编程没有直接关系 由于某些原因 我们确实需
  • 合并合并 pdf 之间的字体 itextsharp C#

    我需要将多个 pdf 合并在一起 我正在使用 itextsharp 创建所有 pdf 我需要将 pdf 的大小减小到尽可能小的大小 我知道每个 pdf 的字体都是重复的 合并后的 pdf 中是否只能使用一组字体 例如 pdf1是2 8mb
  • Python在数据框中每周增加日期

    我正在尝试满足此要求 我需要以周为单位增加日期 以下是相同的代码 import pandas as pd import numpy as np c 15 s week 1 2 3 4 5 6 7 8 Sales 10 20 30 40 50
  • Java 泛型方法重写

    我有界面 public interface CartService extends RemoteService
  • 如何使用 npm 发布客户端脚本?

    我的 Nodejs 包包含在后端执行的代码以及在浏览器上执行的单个 js 文件 要使用浏览器脚本 必须将其放入script显然 HTML 文件中的元素 我的问题是 是否存在关于浏览器 js 文件如何以独立于 webpack gulp gru
  • pandas from_json 方法用法

    我有一个如下所示的 JSON 文件 A 1 B 2 C x 1 y 2 z 3 x 2 y 7 z 77 pandas from json返回包含 A B 和 C 列的数据框 但是 实际上我正在寻找包含 x y 和 z 的列 有办法得到吗
  • 使用Python子进程将stdout重定向到stdin?

    我正在使用 subprocess 模块从 shell 调用程序 该模块将二进制文件输出到 STDOUT 我使用 Popen 调用程序 然后我想将流传递给 Python 包 称为 pysam 中的函数 不幸的是 该函数不能使用 Python
  • 使用 DX:AX 装配 x86 划分

    我正在使用 masm 遇到了一个我不太明白如何解决的场景 例如 X A C D 如果我先乘以 C D 我的值是 DX AX 据我所知 我不能将其用作除数 如果我将 A C 和 A D 分开进行除法 我就会面临失去精度的风险 来自提醒等 实现
  • 从名称实例化泛型的最佳方法是什么?

    假设我只有 MyCustomGenericCollection of MyCustomObjectClass 形式的字符串形式的泛型类名 并且不知道它来自哪个程序集 那么创建该对象的实例的最简单方法是什么 如果有帮助 我知道该类实现 IMy
  • Tomcat连接池,为Web应用程序安装jdbc驱动程序

    我正在制作一个网络应用程序Tomcat 6作为容器 我正在尝试使用连接池 我正在使用的jdbc驱动程序是jtds 1 2 2 当驱动程序 jar 放在下面时 池工作正常 Catalina Home lib 但我的托管提供商不允许我这样做 当
  • 最佳实践:在 PHP 中使用长的多行字符串?

    注意 如果这是一个非常简单的问题 我很抱歉 但我对代码的格式有点强迫症 我有一个类 它有一个函数返回一个字符串 该字符串将构成电子邮件的正文 我希望该文本经过格式化 以便在电子邮件中看起来正确 但也不会让我的代码看起来很时髦 这就是我的意思
  • 核心数据对象唯一ID

    我想向我的托管对象实体模型添加一个唯一的 ID 字段 我知道核心数据不使用 ID 关系 但这是不同的 我需要一种将线程安全数据传递给不同线程的方法 以便新线程可以从该数据中获取托管对象 它可以是任何格式 但最好只是单个对象 变量 值 我可以
  • SQL 错误:ORA-00907:缺少右括号

    我正在使用 Oracle SQL Developer 使用以下命令创建一个基本表 CREATE TABLE chartered flight flight no NUMBER 4 PRIMARY KEY customer id FOREIG
  • 创建仅包含给定类的对象的数组

    好的 我有下面的代码 Objective C FYI 我想知道是否要创建一个 NSMutableArrayc data对象 我该怎么做呢 这有点像声明一个List
  • 如何将用户输入保存在数组中?

    我正在尝试编写一个程序 要求用户输入要保存在医院数据库中的患者数量 即ArraySize 用户必须输入患者的 ID 名字和姓氏 然后根据患者病情的严重程度在数组中对患者的 ID 名字和姓氏进行索引 我的问题是如何将用户输入的 ID 保存为整
  • 测试非默认 App Engine 任务队列

    App Engine 文档给出了example单元测试任务队列 这对于 默认 队列工作正常 但我需要对非默认队列进行单元测试 我从以下行中得到异常 val qsi ltq getQueueStateInfo get non default
  • 当我保存文件时 Sublime Text 正在做什么?

    我正在观看文件fsnotify这是一个Go库 我发现保存文件时会触发很多事件 为什么 Sublime Text 有这么多功能 2013 12 17 20 46 25 event parser go MODIFY 2013 12 17 20
  • 如果另一个值不存在,如何根据一个值从表中选择项目? (雄辩/sql)

    我有一个表 用于存储网站的不同文本块 我目前正在为每个页面选择正确的块以及页面的标题和首选语言 当首选语言不可用时 我想在后备语言中选择相同的文本块 具有相同的标题 块表 columns id slug title language con
  • java.lang.UnsatisfiedLinkError:dlopen 失败:

    当我在项目中添加 so 文件时 我遇到了这个问题 从其他答案来看 我尝试了不同的解决方案 但没有任何解决方案可以帮助我 case 1我曾尝试将 so 放入 src main jniLibs 中 并在 gradle 文件中添加以下行 但出现相
  • 在Java中,当另一个音频文件开始使用key_events时,如何停止前一个音频文件

    我知道 Clip stop 方法 但是当我将它放在 key events 中时它似乎不起作用 它只会导致错误 好吧 我知道为什么会导致错误 因为我要求它基本上停止几行之后才存在的剪辑 但是使用相同的逻辑或接近它 如果可能 我如何重新编码 以