- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的音乐播放器项目中的 JLayer
有一个非常具体的问题。我想包括一些东西来调整音量,但似乎不太容易实现。
这是因为 JLayer
本身不支持它。我从我的项目中排除了 Player
类并更改了一些方法,它可以很好地播放 mp3
。为了调整音量,我将此方法添加到 Player
类:
public boolean setGain(float newGain) {
if (audio instanceof JavaSoundAudioDevice) {
System.out.println("InstanceOf");
JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audio;
try {
jsAudio.write(null, 0, 0);
} catch (JavaLayerException ex) {
ex.printStackTrace();
}
return jsAudio.setLineGain(newGain);
}
return false;
}
然后我提取了 JavaSoundAudioDevice
,反编译并更改了它:
public boolean setLineGain(float gain)
{
System.out.println("Vor Source");
if (source != null)
{
System.out.println("Nach Source");
FloatControl volControl = (FloatControl) source.getControl(FloatControl.Type.MASTER_GAIN);
float newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum());
volControl.setValue(newGain);
return true;
}
return false;
}
和:
public void createSource() throws JavaLayerException {
Throwable t = null;
try {
Line line = AudioSystem.getLine(getSourceLineInfo());
if (line instanceof SourceDataLine) {
source = (SourceDataLine) line;
//source.open(fmt, millisecondsToBytes(fmt, 2000));
source.open(fmt);
/*
if (source.isControlSupported(FloatControl.Type.MASTER_GAIN))
{
FloatControl c = (FloatControl)source.getControl(FloatControl.Type.MASTER_GAIN);
c.setValue(c.getMaximum());
}*/
source.start();
}
} catch (RuntimeException ex) {
t = ex;
} catch (LinkageError ex) {
t = ex;
} catch (LineUnavailableException ex) {
t = ex;
}
if (source == null) {
throw new JavaLayerException("cannot obtain source audio line", t);
}
}
但是已经实现的createSource
方法不起作用。在行
Line line = AudioSystem.getLine(getSourceLineInfo());
我总是得到 IllegalArgumentException:
java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 0.0 Hz, 16 bit, 0 channels, 0 bytes/frame, little-endian is supported.
at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:479)
at javazoom.jl.player.JavaSoundAudioDevice.createSource(JavaSoundAudioDevice.java:80)
at javazoom.jl.player.JavaSoundAudioDevice.writeImpl(JavaSoundAudioDevice.java:119)
at javazoom.jl.player.AudioDeviceBase.write(Unknown Source)
at MusikPlayer.Erweiterungen.Players.MyPlayer.setGain(MyPlayer.java:192)
at MusikPlayer.PlayerTest.main(PlayerTest.java:21)
Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 0.0 Hz, 16 bit, 0 channels, 0 bytes/frame, little-endian is supported.
at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:479)
at javazoom.jl.player.JavaSoundAudioDevice.createSource(JavaSoundAudioDevice.java:80)
at javazoom.jl.player.JavaSoundAudioDevice.writeImpl(JavaSoundAudioDevice.java:119)
at javazoom.jl.player.AudioDeviceBase.write(Unknown Source)
at MusikPlayer.Erweiterungen.Players.MyPlayer.decodeFrame(MyPlayer.java:161)
at MusikPlayer.Erweiterungen.Players.MyPlayer.play(MyPlayer.java:87)
at MusikPlayer.Erweiterungen.Players.MyPlayer.play(MyPlayer.java:66)
at MusikPlayer.PlayerTest.main(PlayerTest.java:22)
有人知道为什么会这样吗?有谁知道如何解决这个问题?
最佳答案
好吧,我解决了..使用此测试类:
public class PlayerTest {
public static void main(String[] args) {
try {
File f = new File("D:\\Musik\\Musik-Oberordner\\Favoriten\\06-ich_und_ich_-_so_soll_es_bleiben.mp3");
MyPlayer player = new MyPlayer(new FileInputStream(f));
player.setGain(-30f);
player.play();
} catch (JavaLayerException | FileNotFoundException ex) {
ex.printStackTrace();
}
}
setten Gain 将调整音量,从 -80.0f 到 6f。
更改后的 JavaSoundAudioDevice:
package javazoom.jl.player;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javazoom.jl.decoder.Decoder;
import javazoom.jl.decoder.JavaLayerException;
/**
* The <code>JavaSoundAudioDevice</code> implements an audio device by using the
* JavaSound API.
*
* @since 0.0.8
* @author Mat McGowan
*/
public class JavaSoundAudioDevice extends AudioDeviceBase {
private SourceDataLine source = null;
private AudioFormat fmt = null;
private byte[] byteBuf = new byte[4096];
protected void setAudioFormat(AudioFormat fmt0) {
fmt = fmt0;
}
protected AudioFormat getAudioFormat() {
// if (fmt == null) {
fmt = new AudioFormat(44100,
16,
2,
true,
false);
return fmt;
}
protected DataLine.Info getSourceLineInfo() {
AudioFormat fmt = getAudioFormat();
//DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt, 4000);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
return info;
}
public void open(AudioFormat fmt) throws JavaLayerException {
if (!isOpen()) {
setAudioFormat(fmt);
openImpl();
setOpen(true);
}
}
public boolean setLineGain(float gain) {
System.out.println("Vor Source");
if (source != null) {
System.out.println("Nach Source");
FloatControl volControl = (FloatControl) source.getControl(FloatControl.Type.MASTER_GAIN);
float newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum());
volControl.setValue(newGain);
return true;
}
return false;
}
public void openImpl()
throws JavaLayerException {
}
// createSource fix.
public void createSource() throws JavaLayerException {
Throwable t = null;
try {
Line line = AudioSystem.getLine(getSourceLineInfo());
if (line instanceof SourceDataLine) {
source = (SourceDataLine) line;
//source.open(fmt, millisecondsToBytes(fmt, 2000));
source.open(fmt);
// if (source.isControlSupported(FloatControl.Type.MASTER_GAIN))
// {
// System.out.println("Control");
// FloatControl c = (FloatControl)source.getControl(FloatControl.Type.MASTER_GAIN);
// c.setValue(c.getMinimum());
// }
source.start();
}
} catch (RuntimeException ex) {
t = ex;
} catch (LinkageError ex) {
t = ex;
} catch (LineUnavailableException ex) {
t = ex;
}
if (source == null) {
throw new JavaLayerException("cannot obtain source audio line", t);
}
}
public int millisecondsToBytes(AudioFormat fmt, int time) {
return (int) (time * (fmt.getSampleRate() * fmt.getChannels() * fmt.getSampleSizeInBits()) / 8000.0);
}
protected void closeImpl() {
if (source != null) {
source.close();
}
}
protected void writeImpl(short[] samples, int offs, int len)
throws JavaLayerException {
if (source == null) {
createSource();
}
byte[] b = toByteArray(samples, offs, len);
source.write(b, 0, len * 2);
}
protected byte[] getByteArray(int length) {
if (byteBuf.length < length) {
byteBuf = new byte[length + 1024];
}
return byteBuf;
}
protected byte[] toByteArray(short[] samples, int offs, int len) {
byte[] b = getByteArray(len * 2);
int idx = 0;
short s;
while (len-- > 0) {
s = samples[offs++];
b[idx++] = (byte) s;
b[idx++] = (byte) (s >>> 8);
}
return b;
}
protected void flushImpl() {
if (source != null) {
source.drain();
}
}
public int getPosition() {
int pos = 0;
if (source != null) {
pos = (int) (source.getMicrosecondPosition() / 1000);
}
return pos;
}
/**
* Runs a short test by playing a short silent sound.
*/
public void test()
throws JavaLayerException {
// try {
open(new AudioFormat(22000, 16, 1, true, false));
short[] data = new short[22000 / 10];
write(data, 0, data.length);
flush();
close();
// } catch (RuntimeException ex) {
// throw new JavaLayerException("Device test failed: " + ex);
// }
}
}
现在您只需将它实现到您的项目中,覆盖旧的 JavaSoundDevice 并享受 VolumeAdjusting!
关于java - 使用 JLayer 改变音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076260/
如何在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 上绘制的部分仍然显示
我是一名优秀的程序员,十分优秀!