我正在尝试使用Snow Leopard上的Java Sound录制/处理来自三个usb麦克风的一些音频(但如果修复了某些内容,可以切换到Windows).问题是,当我尝试使用与usb麦克风相对应的混音器时,Java Sound告诉我该行不受支持.具体来说,它说...
可用的搅拌机:
Java声音音频引擎
USBMIC Serial#041270067
内置输入内置麦克风
Soundflower(2ch)
Soundflower(16ch)
线程"AWT-EventQueue-0"中的异常java.lang.IllegalArgumentException:Line unsupported:interface TargetDataLine支持格式PCM_SIGNED 96000.0 Hz,8位,立体声,2字节/帧,
...当我要求它选择USBMIC调音台时:
Mixer mixer = AudioSystem.
getMixer(mixerInfo[1]);
Run Code Online (Sandbox Code Playgroud)
我已经尝试将音频格式与麦克风(16位,44100Hz,立体声)的确切规格相匹配,但没有任何区别.
问题出在这里:
final TargetDataLine line = (TargetDataLine)
mixer.getLine(info);
Run Code Online (Sandbox Code Playgroud)
似乎混音器和TargetDataLine彼此不喜欢.有没有办法让这两个人"匹配"并相处?
我正在使用的麦克风确实有点奇怪.它们被用于名为SingStar的卡拉OK视频游戏中.麦克风本身具有标准的单声道输入连接器,插入一个小集线器(两个到集线器),将它们转换为单个公头usb连接器.但是,除了陌生之外,它们似乎与Audacity一起作为单独的频道完美地工作,所以用它们进行多声道录音显然是可能的,也许不是用Java.
我还考虑使用像Soundflower这样的程序,在不同程序之间共享音频.但是,我不确定这是否会起作用,因为我无法看到如何将USB麦克风输入到Soundflower,然后将它们传输到Java中.一个快速的实验告诉我,我可以从麦克风中录制Audacity中的音频,通过Soundflower将其输出,然后在我的Java程序中处理.不过,我想要做的就是让它全部用Java实现.
有人熟悉这类问题吗?
我正在尝试将.MID文件读入Java程序,并希望将每个音符/和弦分开,以便在某种UI上显示它们.我在Java中使用Sequencer API并没有太多运气,并且尝试直接使用MidiFileReader对我来说也不起作用.我会附上我在这里使用的代码,如果有人想看到的话:
package miditest;
import java.io.File;
import java.io.IOException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class Main {
public static void main(String[] args) throws InvalidMidiDataException, IOException, MidiUnavailableException{
Sequence sequence = MidiSystem.getSequence(new File("test.mid"));
// Create a sequencer for the sequence
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
sequencer.setSequence(sequence);
// Start playing
sequencer.start();
}
}
Run Code Online (Sandbox Code Playgroud) 如何使用Java增加传出wav音频流的音量?我遇到了各种Java TTS引擎和合成语音输出量的问题.是否有API调用或doo-hickey.jar我可以用来提高音量?
这个问题通常被问到是另一个问题的一部分,但事实证明答案很长.我决定在这里回答它,所以我可以在其他地方链接到它.
虽然我不知道Java此时可以为我们生成音频样本的方式,但如果将来发生变化,这可能是一个适合它的地方.我知道JavaFX有一些这样的东西,例如AudioSpectrumListener,但仍然不能直接访问样本.
我正在javax.sound.sampled用于播放和/或录制,但我想对音频做些什么.
也许我想直观地展示它或以某种方式处理它.
如何使用Java Sound访问音频样本数据?
也可以看看:
在Java中开始录制操作时,如何检测静音?什么是PCM数据?如何在Java中计算PCM数据?
我找到了解决方案:
package bemukan.voiceRecognition.speechToText;
import javax.sound.sampled.*;
import java.io.*;
public class RecordAudio {
private File audioFile;
protected boolean running;
private ByteArrayOutputStream out;
private AudioInputStream inputStream;
final static float MAX_8_BITS_SIGNED = Byte.MAX_VALUE;
final static float MAX_8_BITS_UNSIGNED = 0xff;
final static float MAX_16_BITS_SIGNED = Short.MAX_VALUE;
final static float MAX_16_BITS_UNSIGNED = 0xffff;
private AudioFormat format;
private float level;
private int frameSize;
public RecordAudio(){
getFormat();
}
private AudioFormat getFormat() {
File file = new File("src/Facebook/1.wav");
AudioInputStream stream;
try {
stream = AudioSystem.getAudioInputStream(file);
format=stream.getFormat();
frameSize=stream.getFormat().getFrameSize();
return …Run Code Online (Sandbox Code Playgroud) 我需要在Linux环境下使用Java代码播放MP3文件(Ubuntu 11.04).
我试图从http://www.oracle.com/technetwork/java/javase/download-137625.html下载MP3plugin.jar文件,但我在列表中看不到它.
注意:"我下载了sun Java Media Framework"
tl; dr对于未来的读者,使用Java或C#无法(现在)录制实时音频.使用C++,因为它提供了大量的音频api.
我的目标是获得在Windows机器上播放的当前声音,并像图形音频可视化器一样分析声音(获得音量属性和Hz(基数和高音)).当我说当前声音时,我的意思是如果要播放Youtube视频或Spotify歌曲,这个程序会读取该音频输出.我无意播放声音,但实时捕捉它并将其可视化.
在尝试这样做时,我阅读了如何构建音频波形显示,并探讨了如何将音频文件转换为字节数组(一行).这没有用,因为它不会得到当前的声音.我还阅读了如何捕获音频,以及这个java访问声音教程,这些都没有回答我的问题,因为它们都需要加载歌曲文件.
我根本就不理解这一点.我完全无能为力,任何帮助都会受到赞赏.
编辑:我做了一些更多的环顾四周,这个来源的第二个答案让我得出结论:我可以找到所有的音频设备,看看哪一个产生声音.我不知道在那之后该怎么办.
编辑2(再次编辑):从实验和环顾四周,我在下面编写了这段代码.我认为这让我朝着我想要的方向前进,但我不知道如何完成它.
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
for (Mixer.Info mixerInfo : mixers) {
Mixer mixer = AudioSystem.getMixer(mixerInfo);
try {
mixer.open();
Line.Info[] lines = mixer.getTargetLineInfo();
for (Line.Info linfo : lines) {
Line line = AudioSystem.getLine(linfo);
//here I'm opening the line, but I don't know how to grab data
line.open();
}
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我使用了这个来源:在混音器行中检查音频播放的级别 …
1.考虑我的代码是在我的JPanel的某些行上,我是否自动在EDT上?
2.对于不属于GUI,JPanels或其他视图类,简单逻辑类的所有其他类的同名问题.
3.如果我有JPanel我正在播放音乐,那么音乐应该在事件发送线程上运行还是在非EDT的其他线程上运行(因为我没有遇到任何运行问题)来自EDT)?
注意:我想要一般规则如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下了解它
在Java中以任何频率生成正弦波声音的最简单方法是什么?样本大小超过2个字节会有所帮助,但这并不重要.
谢谢
java ×10
javasound ×10
audio ×7
jmf ×1
jpanel ×1
microphone ×1
midi ×1
mp3 ×1
output ×1
record ×1
swing ×1
trigonometry ×1
ubuntu-11.04 ×1
usb ×1
wave ×1