我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Run Code Online (Sandbox Code Playgroud)
打印时结果是254,但我不知道这段代码是如何工作的.如果&运算符只是按位,那么为什么它不会产生一个字节而是一个整数呢?
我想在java中为麦克风创建一个音频电平表来检查输入的大小.它应该看起来像操作系统之一.我不是在询问gui.它只是计算出来的字节流中的音频电平
n = targetDataLine.read( tempBuffer , 0 , tempBuffer.length );
Run Code Online (Sandbox Code Playgroud)
所以我已经有一些正在运行的东西,但它甚至没有接近我操作系统的水平仪(窗口)它卡在中间.我有0到100之间的值是好的,但在中间音量,无论输入多么大,它都会在60左右.
这是我现在计算的方式:
amplitude = 0;
for (int j = 0; j < tempBuffer.length; j = j +2 ){
if (tempBuffer[j] > tempBuffer[j+1])
amplitude = amplitude + tempBuffer[j] - tempBuffer[j+1];
else amplitude = amplitude + tempBuffer[j + 1] - tempBuffer[j];
}
amplitude = amplitude / tempBuffer.length * 2;
Run Code Online (Sandbox Code Playgroud)
是否有更好/更精确的方法来计算音频电平来监控它?或者我可能犯了一个重大错误?
那是我的Audioformat:
public static AudioFormat getAudioFormat(){
float sampleRate = 20000.0F;
//8000,11025,16000,22050,44100
int sampleSizeInBits = 16;
//8,16
int channels = 1;
//1,2
boolean signed …Run Code Online (Sandbox Code Playgroud) 最近我一直在试验我在计算机上播放的音频的实时可视化(通过任何任意程序,如Spotify),但我一直在使用SoundFlower将输出音频输入到假行中.
我想知道的是,如果有一种C/C++或Java原生的方式,它将允许我捕获发送到我的计算机的任何音频(我正在使用Mac),以类似于我的方式可以捕获一行(IE是一个连续填充PCM数据的样本缓冲区).
除了读取输出数据外,我不想模仿SoundFlower的其他功能.
我对Java不太熟悉,所以请保持简单.但是,我会尝试理解你发布的所有内容.这是我的问题.
我编写了代码来记录来自外部麦克风的音频并将其存储在.wav中.存储此文件与存档目的相关.我需要做的是存储音频的FFT.
我的方法是将wav文件作为一个字节数组加载并转换它,问题是1.我需要摆脱一个标题,但我应该能够做到这一点而且2.我得到了一个字节数组,但我在网上找到的大多数(如果不是全部)FFT算法都尝试使用复杂/两个双数组修补我的项目工作.
我试图解决这两个问题,最后能够将我的FFT数组绘制成图形,当我发现它只是给我回"0"时..wav文件很好,我可以毫无问题地播放它.我想也许把字节转换成双打对我来说是个问题,所以这是我的方法(我知道它不漂亮)
byte ByteArray[] = Files.readAllBytes(wav_path);
String s = new String(ByteArray);
double[] DoubleArray = toDouble(ByteArray);
// build 2^n array, fill up with zeroes
boolean exp = false;
int i = 0;
int pow = 0;
while (!exp) {
pow = (int) Math.pow(2, i);
if (pow > ByteArray.length) {
exp = true;
} else {
i++;
}
}
System.out.println(pow);
double[] Filledup = new double[pow];
for (int j = 0; j < DoubleArray.length; j++) {
Filledup[j] = DoubleArray[j];
System.out.println(DoubleArray[j]);
} …Run Code Online (Sandbox Code Playgroud) 我目前在使用javax.sound.sampled图书馆时遇到了麻烦.这是我用来播放音频文件的MCV代码:
import javax.sound.sampled.*;
import java.io.File;
public class Foo
{
public static void main(String[] args)
{
try
{
File f = new File("alarm.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(f);
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码有时会抛出一个UnsupportedAudioFileException.
基本上,我有5个.WAV文件,我知道这些文件没有损坏,因为当我在我的音乐播放软件中打开它们时它们完全没问题.但是,Java程序仅适用于其中的3个.
Oracle在此提及对此文件格式的支持.如何确保所有.WAV文件都与Java的音频API兼容?是否有一种万无一失的播放.WAV文件的方式,如果由于某种原因他们没有适当的编码?