我目前正在开发一个应用程序,帮助用户调整他的吉他并生成吉他效果.这是实时的.我一直在寻找能够产生吉他效果的java应用程序,例如过载和延迟,但我找不到任何东西.还需要实时创建波形的源.您的意见将非常有用,感谢提前.
我正在寻找有关如何使用Java及其声音API提高声音文件播放速度的信息.
我目前正在使用剪辑和AudioInputStream来播放文件,但如果这意味着我可以提高播放速度,我将很乐意改变它.
我试图在java和matlab中读取.wav文件的数据并保存为字节数组.
在java中,代码如下所示:
public byte[] readWav2(File file) throws UnsupportedAudioFileException, IOException {
AudioFormat audioFormat;
AudioInputStream inputAIS = AudioSystem.getAudioInputStream(file);
audioFormat = inputAIS.getFormat();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Read the audio data into a memory buffer.
int nBufferSize = BUFFER_LENGTH * audioFormat.getFrameSize();
byte[] abBuffer = new byte[nBufferSize];
while (true) {
int nBytesRead = inputAIS.read(abBuffer);
if (nBytesRead == -1) {
break;
}
baos.write(abBuffer, 0, nBytesRead);
}
byte[] abAudioData = baos.toByteArray();
return abAudioData;
}
Run Code Online (Sandbox Code Playgroud)
在matlab中我使用的是wavread函数:
[Y, FS] = wavread('sound.wav', 'native');
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是不同的.
在java中前20个字节:
53, 0, 19, …Run Code Online (Sandbox Code Playgroud) 它可以与File传递给的对象一起使用AudioSystem#getAudioFileFormat,但是为什么InputStream下面的对象不能通过呢?有什么建议吗?
import java.io.*;
import javax.sound.sampled.*;
public class Test {
public static void main(String[] args) throws Exception {
AudioSystem.getAudioFileFormat(new File(
"myaudio.wav"));
AudioSystem.getAudioFileFormat(new FileInputStream(
"myaudio.wav"));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Exception in thread "main" java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:330)
at com.sun.media.sound.WaveFileReader.getAudioFileFormat(WaveFileReader.java:88)
at javax.sound.sampled.AudioSystem.getAudioFileFormat(AudioSystem.java:985)
at Test.main(Test.java:10)
Run Code Online (Sandbox Code Playgroud)
@编辑
据答案@René Jeschke,@Phil Freihofner并且@Andrew Thompson,无论mark/reset被要求作为强制性protocal为Java Sound API与互动IO stream,恕我直言,类型buffered流,而不是raw一个应该被专门定义为参数的签名传递。这样做将使收窄到更理想的结果,而不是任意接受IO stream然后诉诸IOException为不利指标。
我正在制作一个基于Java的游戏,我想添加一些声音效果.我搜查了一下,发现自己更加困惑.我知道编码因文件格式而异.我只需要一些声音 - 无论哪种格式都无关紧要.所以请建议我最简单的文件格式.代码段非常有用.
什么是最简单的格式和提供音效的方法?
如何.wave使用Java 剪切文件?
我想要的是:
当用户按下标cut有按钮的按钮时,应将音频从前一个mark(以纳秒为单位)剪切到当前位置(以纳秒为单位)。(在剪切声音后,标记被定位到当前位置(以纳秒为单位))当我获得那段音频后,我想保存那段音频文件。
// obtain an audio stream
long mark = 0; // initially set to zero
//get the current position in nanoseconds
// after that how to proceed ?
// another method ?
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?
是否可以从InputStream转换为AudioInputStream?
我想在某些事件中播放小声音文件,所以我跟随SoundThread
import java.io.*;
import javax.sound.sampled.*;
public class SoundThread implements Runnable{
private String filename;
SoundThread(String filename) {
this.filename = filename;
}
public void run() {
try {
InputStream in = ClassLoader.getSystemResourceAsStream("sounds/"+filename+".wav");
Clip clip = AudioSystem.getClip();
clip.open((AudioInputStream)in);
clip.start();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (LineUnavailableException e){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我用它来运行它
new Thread(new SoundThread("nameOfTheSoundFile")).start();
Run Code Online (Sandbox Code Playgroud)
一开始我使用sun.audio.AudioPlayer和sun.audio.AudioStream处理它,但是一旦我将代码放在eclipse中,它就会向我显示错误.所以我试过了
AudioInputStream in = (AudioInputStream)ClassLoader.getSystemResourceAsStream("sounds/"+filename+".wav");
Run Code Online (Sandbox Code Playgroud)
将InputStream强制转换为AudioInputStream(eclipse没有显示任何错误),但运行它会引发ClassCastException.这个问题有什么解决方案吗?
我有一个.wav文件.我想从该声音文件中获取PCM数据,以便我可以从声音中获取单个数据块并对其进行处理.
但我不知道该怎么做.谁能告诉我怎么做?到目前为止我做到了这一点:
public class test
{
static int frameSample;
static int timeofFrame;
static int N;
static int runTimes;
static int bps;
static int channels;
static double times;
static int bufSize;
static int frameSize;
static int frameRate;
static long length;
public static void main(String[] args)
{
try
{
AudioInputStream ais = AudioSystem.getAudioInputStream(new File("music/audio.wav"));
AudioInputStream a;
int numBytes = ais.available();
System.out.println("numbytes: "+numBytes);
byte[] buffer = new byte[numBytes];
byte[] buffer1=new byte[numBytes] ;
int k=0;
int count=0;
while(count!=-1){
count=ais.read(buffer, 0, numBytes);
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Scala SBT管理的项目中使用Java Sound API。
这是一个可播放音符的玩具应用。
import javax.sound.midi._
object MyMain extends App {
val infos = MidiSystem.getMidiDeviceInfo()
println( "[DEBUG] midi devices found: " + infos.length )
val myMsg = new ShortMessage;
// Start playing the note Middle C (60),
// moderately loud (velocity = 93).
myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
val timeStamp = -1;
val rcvr : Receiver = MidiSystem.getReceiver();
rcvr.send(myMsg, timeStamp);
readChar() // give time to play note
}
Run Code Online (Sandbox Code Playgroud)
当我run在SBT中执行时,我得到的javax.sound.midi.MidiUnavailableException因为 infos.length返回0。也就是说,当我在IntelliJ中运行该应用程序时,发现了两个设备,并且该音符的播放效果很好。
SBT要使其运行需要知道什么?是否有需要添加到类路径的东西?我注意到IntelliJ将一大堆jar附加到执行命令(但是,删除来自jdk / jre / lib …
数字图像的最小单位是像素.什么是最小的数字声音单位?什么可以被认为是声音的像素?我们如何使用java来操作它?