栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

java clip

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java clip

有几种方法可以实现这一点,但基本思路是,您希望将LineListener注册到Clip并监视LineEvent.Type.STOP事件并重新启用该按钮

例如.这将查找给定目录中的所有.wav文件,并为每个文件创建一个按钮.单击时,按钮(或更重要的是,基础操作)被禁用并播放音频.当它停止时,重新启用Action(和扩展按钮).

无论如何,Sound API可以同时播放多个声音

import java.awt.EventQueue;

import java.awt.GridBagConstraints;

import java.awt.GridBagLayout;

import java.awt.event.ActionEvent;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.io.FileFilter;

import java.io.IOException;

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.concurrent.ExecutionException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.Clip;

import javax.sound.sampled.LineEvent;

import javax.sound.sampled.LineListener;

import javax.sound.sampled.LineUnavailableException;

import javax.sound.sampled.UnsupportedAudioFileException;

import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingWorker;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

public class Test {

public static void main(String[] args) {

new Test();

}

public Test() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

ex.printStackTrace();

}

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new TestPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class TestPane extends JPanel {

public TestPane() {

File[] musicFiles = new File("a directory somewhere").listFiles(new FileFilter() {

@Override

public boolean accept(File pathname) {

return pathname.getName().toLowerCase().endsWith(".wav");

}

});

setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridwidth = GridBagConstraints.REMAINDER;

gbc.fill = GridBagConstraints.HORIZONTAL;

for (File music : musicFiles) {

try {

JButton btn = new JButton(new AudioAction(music.getName(), music.toURI().toURL()));

add(btn, gbc);

} catch (MalformedURLException ex) {

ex.printStackTrace();

}

}

}

}

public class AudioAction extends AbstractAction {

private URL audio;

public AudioAction(String name, URL audioSource) {

super(name);

this.audio = audioSource;

}

public URL getAudioSource() {

return audio;

}

@Override

public void actionPerformed(ActionEvent e) {

setEnabled(false);

try (InputStream is = getAudioSource().openStream()) {

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(is);

Clip play = AudioSystem.getClip();

play.addLineListener(new LineListener() {

@Override

public void update(LineEvent event) {

System.out.println(event.getFramePosition());

if (event.getType().equals(LineEvent.Type.STOP)) {

setEnabled(true);

}

}

});

play.open(audioInputStream);

play.start();

} catch (IOException | LineUnavailableException | UnsupportedAudioFileException exp) {

exp.printStackTrace();

}

}

}

}

nb:我尝试使用Clip#drain(在后台线程中),但它只适用于第一个剪辑,后续剪辑基本上跳过了方法,因此我选择了LineListener

现在有了更好的资源管理

import java.awt.EventQueue;

import java.awt.GridBagConstraints;

import java.awt.GridBagLayout;

import java.awt.event.ActionEvent;

import java.io.File;

import java.io.FileFilter;

import java.io.IOException;

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.Clip;

import javax.sound.sampled.LineEvent;

import javax.sound.sampled.LineListener;

import javax.sound.sampled.LineUnavailableException;

import javax.sound.sampled.UnsupportedAudioFileException;

import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

public class Test {

public static void main(String[] args) {

new Test();

}

public Test() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

ex.printStackTrace();

}

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new TestPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class TestPane extends JPanel {

public TestPane() {

File[] musicFiles = new File("...").listFiles(new FileFilter() {

@Override

public boolean accept(File pathname) {

return pathname.getName().toLowerCase().endsWith(".wav");

}

});

setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridwidth = GridBagConstraints.REMAINDER;

gbc.fill = GridBagConstraints.HORIZONTAL;

for (File music : musicFiles) {

try {

JButton btn = new JButton(new AudioAction(music.getName(), music.toURI().toURL()));

add(btn, gbc);

} catch (MalformedURLException exp) {

exp.printStackTrace();

}

}

}

}

public class AudioAction extends AbstractAction {

private AudioPlayer player;

public AudioAction(String name, URL audioSource) {

super(name);

player = new AudioPlayer(audioSource);

}

@Override

public void actionPerformed(ActionEvent e) {

if (player.isPlaying()) {

player.stop();

} else {

try {

player.play();

} catch (IOException | LineUnavailableException | UnsupportedAudioFileException ex) {

ex.printStackTrace();

}

}

}

}

public class AudioPlayer {

private Clip clip;

private URL url;

public AudioPlayer(URL url) {

this.url = url;

}

public boolean isPlaying() {

return clip != null && clip.isRunning();

}

protected void open() throws IOException, LineUnavailableException, UnsupportedAudioFileException {

clip = AudioSystem.getClip();

clip.open(AudioSystem.getAudioInputStream(url.openStream()));

}

public void play() throws IOException, LineUnavailableException, UnsupportedAudioFileException {

if (clip == null || !clip.isRunning()) {

open();

clip.setFramePosition(0);

clip.start();

}

}

public void stop() {

if (clip != null && clip.isRunning()) {

clip.stop();

clip.flush();

dispose();

}

}

public void dispose() {

try {

clip.close();

} finally {

clip = null;

}

}

}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023791.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号