2 回答
TA贡献1911条经验 获得超7个赞
平移和音量控制取决于系统,即使安装到位,有时也会有些不稳定。例如,如果您一次更改音量或声相设置太多,则不连续会引起咔嗒声。
一种解决方案是逐帧进入并自行进行更改。例如,请参阅教程“使用控件处理音频”末尾的“直接操作音频数据” 。
有关示例,请参考下一篇教程中的代码:使用文件和格式转换器。在“读取声音文件”标题下查找并在代码“ \此处,执行有用的操作...”中查找注释。
我邀请您也看看我编写并提供的代码,该类称为AudioCue,它具有实时平移以及实时音量和音高播放控件。我添加了平滑处理(用于平移更改的1024个步骤),以帮助减轻不连续的可能性。
取mp3文件并将其解码为音频数据阵列将由您自己决定。我认为github上提供的javazoom库应该为您提供足够的代码访问权限,以弄清楚如何执行此操作(我在进行ogg / vorbis解码时就这样做了)。拥有音频数据的浮点数组(立体声,带符号的浮点范围从-1到1)后,可以将其直接加载到AudioCue中。
TA贡献1815条经验 获得超10个赞
首先,多亏了安德鲁·汤普森(Andrew Thompson)和菲尔·弗赖霍夫纳(Phil Freihofner),我很高兴能成为这个社区的一员并得到信任的人。你真的让自己感到高兴:)
我在这里留下了完全符合我想要的功能的完整代码。
正如JavaZoom MP3 SPI文档所说:确保CLASSPATH中提供JLayer,Tritonus和MP3SPI库。
import javax.sound.sampled.*;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException,
UnsupportedAudioFileException, LineUnavailableException {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
String path = chooser.getSelectedFile().getAbsolutePath();
System.err.println(path);
File file = new File(path);
AudioInputStream baseStream = AudioSystem.getAudioInputStream(file);
AudioFormat baseFormat = baseStream.getFormat();
System.err.println(baseFormat.toString());
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16, baseFormat.getChannels(), baseFormat.getChannels() * 2,
baseFormat.getSampleRate(), true);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
AudioInputStream stream = AudioSystem.getAudioInputStream(format, baseStream);
SourceDataLine audioLine = (SourceDataLine) AudioSystem.getLine(info);
audioLine.open(format);
audioLine.start();
FloatControl pan = (FloatControl) audioLine.getControl(FloatControl.Type.PAN);
pan.setValue(1);
int BUFFER_SIZE = 4096;
byte[] buffer = new byte[BUFFER_SIZE];
int read = -1;
while((read = stream.read(buffer)) != -1){
audioLine.write(buffer, 0, read);
}
audioLine.drain();
audioLine.close();
}
}
添加回答
举报