- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始使用 Jlayer 库来播放 MP3。它工作得很好,我可以播放这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让播放 MP3 的线程等待,声音会停止,为了恢复歌曲,我只需要通知线程即可。这是我得到的:
import java.util.Scanner;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
public class MP3 extends Thread{
private String filename;
private Player player;
private Thread t;
private volatile boolean continuePlaying = true;
// constructor that takes the name of an MP3 file
public MP3(String filename) {
this.filename = filename;
}
public void close() { if (player != null) player.close(); }
// play the MP3 file to the sound card
public void play() {
try {
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
player = new Player(bis);
}
catch (Exception e) {
System.out.println("Problem playing file " + filename);
System.out.println(e);
}
}
public void run() {
play();
try {
while (true) {
synchronized(this) {
while(!continuePlaying)
wait();
player.play();
}
}
}
catch (Exception e) {
System.out.println(e);
}
}
private void pause() throws InterruptedException{
System.out.println("Pause");
continuePlaying = false;
}
private void resumeSong() throws InterruptedException{
synchronized(this) {
System.out.println("Resume");
continuePlaying = true;
notify();
}
}
// test client
public static void main(String[] args) throws InterruptedException{
String filename = ("Fall To Pieces.mp3");
MP3 mp3 = new MP3(filename);
mp3.start();
Scanner s = new Scanner(System.in);
s.nextLine();
mp3.pause();
s.nextLine();
mp3.resumeSong();
try {
mp3.join();
} catch (Exception e){
}
}
}
但是,由于某种原因,wait() 不执行任何操作,程序甚至没有到达 notification()。为什么会出现这种情况?
我已经阅读了之前关于此问题的问题,但我无法使它们发挥作用。我也有兴趣了解为什么这段代码不起作用,以便我可以进一步了解多线程。谢谢!
最佳答案
现在已经很晚了,如果我读错了您的代码,请原谅我。但据我所知,您以 continuePlaying = true;
启动线程,并且 run 方法仅调用 play();
没有初始化新播放器,然后直接进入一个必须退出点的 while (true) 循环。 continuePlaying 不能被仍然陷入无限循环的线程更改,即使您启动另一个 MP3 线程来访问 volatile 变量,它也会在能够更改任何内容之前进入相同的循环。因此 wait() 永远不会到达。稍后,您尝试从其内部通知()您的等待线程。这有点悖论,因为它正在等待被通知,并且处于等待状态,什么也不做,更不用说通知自己了。在收到通知之前它根本无法做任何事情,包括通知自己或其他人。我想说的是,您应该处理 wait(),尤其是来自正在处理/等待的线程外部的 notification()。
此外,您的 player.play();
处于奇怪的位置。目前,播放器只能在线程暂停(等待)至少一次后才开始播放,因为它位于 while(!continuePlaying)
条件之后。
因此,对于您的情况,我会选择使用不同线程(甚至是测试的主线程)中的方法,这些方法调用 wait() 和 notification() 并在相关线程上同步。
关于java - JLayer 暂停和恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756516/
如何在jlayer中停止MP3? (stop() 不再使用) 我的代码如下: //main class mp3_main private AdvancedPlayer player;
我刚刚开始使用 Jlayer 库来播放 MP3。它工作得很好,我可以播放这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让播放 MP3 的线程等待,声音会停止,为了恢复歌曲,
我对 jLayer 有疑问。我有一个带有开始播放歌曲代码的按钮: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt
我注意到很多主题都是关于使用 JLayer 暂停/恢复 MP3 的,所以为了帮助大家,我专门为此设计了一个完整的类(class)!请参阅下面的答案。 注意:这是供我个人使用的,因此它可能不像某些人希望
我和一个 friend 正在将 MP3 播放器编程作为学校项目。我们即将完成,现在陷入了尝试编写一个函数来改变播放器音量的阶段。我们正在使用: 音频设备 高级玩家 我知道其他人已经问过同样的问题,但我
我一直在测试一个可以在 PC 和 Android 平台上运行的 Java 库,前段时间有人告诉我使用 JLayer。今天我正在愉快地编码,然后出现了这个异常: java.lang.ExceptionI
由于某种原因,每个图像仅显示 1/5(或更少)。由于它是分层 Pane ,因此至少应完全显示 1 个。布局为空,因为这是一个学习程序为什么会发生这种情况? 代码如下:类测试1 import javax
我想在图像上放置一个网格。我使用了一个使用 paintComponent 方法保存图像的 JLabel,我使用这个方法是因为在我的项目和 JLayer GridLayer; JLabel im
我的音乐播放器项目中的 JLayer 有一个非常具体的问题。我想包括一些东西来调整音量,但似乎不太容易实现。 这是因为 JLayer 本身不支持它。我从我的项目中排除了 Player 类并更改了一些方
您好,我想降低音量播放声音。我用了jl1.0.1让它发挥作用。我正在搜索如何控制音量,这就是我使用的代码 public static void playSound(String name){
我需要知道我应该使用什么来控制我使用 jLayer 创建的 MP3 播放器的音量?我可以使用哪些 API 或方法来控制 mp3 文件的音量? 最佳答案 public class VolumeSli
我正在尝试用 JLayer 包装一个 JButton 以向其添加一些效果/功能。当我用工具栏中的包装器替换按钮时,它会出于某种原因绘制按钮边框。工具栏已将翻转设置为 true。 为什么会发生这种情况,
我在 Clojure 中编写了几百行应用程序,这些应用程序使用 JLayer Java 库作为我在后台运行 mp3 的音频。这工作正常,但只要我在后台运行任何其他音乐、YouTube 等(我正在运行
我有一个线程来播放音频,但是当我关闭表单时,我想停止播放器播放音频文件,我的线程运行方法是: public static Player playplayer; public static FileIn
我正在使用 jLayer 1.0 来播放一个简单的 mp3 文件。除了前 3 秒左右,它工作正常(在轨道开头添加 5 秒的静音解决了这个问题)。这是我正在使用的代码: try { final
正在关注 Oracle's Myopia guide ,我有一个简单的 JPanel,它作为 JLayer 添加到 JFrame。很简单,这模糊了 JPanel 的组件。但是,我正在尝试在此 JPan
我正在使用 JLayer 解码 MP3,并将其存储为 PCM 数据。但是,无论我使用什么 MP3 文件,我总是会收到索引为 443 的 ArrayIndexOutOfBoudnsException。我
我正在尝试将图像背景设置在 3 个 JButton 后面。截至目前,它正在绘制背景,然后将按钮放在没有背景的下方(拉伸(stretch)窗口以查看)。我将如何使用 JLayeredPane 将背景图像
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我想在用户输入无效时绘制一个图标。我找到了 Oracle 的示例并根据我的目的对其进行了修改。图标的绘制工作正常,但是当我更改值以更正图标时,图标不会完全不可见:在 JPanel 上绘制的部分仍然显示
我是一名优秀的程序员,十分优秀!