[英]No JAVA sound control when I'm using Linux?
我正在使用JAVA聲音API,並且試圖在混音器和線路上獲得一些控件(至少是音量),但是似乎沒有控件。 這是我正在使用的部分代碼:
for (Mixer.Info mixerInfo : AudioSystem.getMixerInfo()) {
//System.out.println("MixerInfo : "+mixerInfo.getName());
if (mixerInfo.getName().compareTo("PulseAudio Mixer")==0) {
System.out.println("Java Sound Audio Engine : "+AudioSystem.getMixer(mixerInfo));
mixer=AudioSystem.getMixer(mixerInfo);
System.out.println("\t Controls supported by Mixer:");
for(Control c : mixer.getControls()) {
System.out.println("\t =>" + c);
}
System.out.println("\t TargetLine availabe for this mixer : ");
for (Line.Info i : mixer.getTargetLineInfo()) {
System.out.println("\t => "+i);
System.out.println("\t\t Controls supported by Target Line :");
try {
for (Control c : AudioSystem.getLine(i).getControls()) {
System.out.println("\t\t =>"+c);
}
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("--------------------------");
//break;
} else {
//System.out.println("Other Mixer : "+AudioSystem.getMixer(mixerInfo));
System.out.println("Other Sound Audio Engine : "+AudioSystem.getMixer(mixerInfo));
mixer2=AudioSystem.getMixer(mixerInfo);
System.out.println("\t Controls supported by Mixer:");
for(Control c : mixer2.getControls()) {
System.out.println("\t =>" + c);
}
System.out.println("\t TargetLine availabe for this mixer :");
for (Line.Info i : mixer2.getSourceLineInfo()) {
System.out.println("\t => "+i);
System.out.println("\t\t Controls supported by Target Line :");
try {
for (Control c : AudioSystem.getLine(i).getControls()) {
System.out.println("\t\t =>"+c);
}
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("--------------------------");
}
}
這是在控制台中產生的結果:
Java聲音音頻引擎:混音器支持的org.classpath.icedtea.pulseaudio.PulseAudioMixer@1404d1控件:
該混音器的TargetLine可用:
=>接口TargetDataLine支持42種音頻格式以及0到1000000字節的緩沖區
目標行支持的控件:
其他聲音音頻引擎:com.sun.media.sound.DirectAudioDevice@13b8dae
混音器支持的控件:
該混音器的TargetLine可用:
=>接口SourceDataLine支持512種音頻格式,以及至少32個字節的緩沖區
目標行支持的控件:
=>接口剪輯,支持512種音頻格式以及至少32個字節的緩沖區
目標行支持的控件:
其他聲音音頻引擎:com.sun.media.sound.DirectAudioDevice@1cad7c3混音器支持的控件:
該混音器的TargetLine可用:
=>接口SourceDataLine支持24種音頻格式,以及至少32個字節的緩沖區
目標行支持的控件:
=>接口剪輯,支持24種音頻格式以及至少32個字節的緩沖區
目標行支持的控件:
其他聲音音頻引擎:com.sun.media.sound.DirectAudioDevice@1a9cf86
混音器支持的控件:
該混音器的TargetLine可用:
=>接口SourceDataLine支持24種音頻格式,以及至少32個字節的緩沖區
目標行支持的控件:
=>接口剪輯,支持24種音頻格式以及至少32個字節的緩沖區
目標行支持的控件:
其他聲音音頻引擎:com.sun.media.sound.PortMixer@17fd320混音器支持的控件:
該混音器的TargetLine可用:
=>麥克風升壓源端口
目標行支持的控件:
=>捕獲源端口
目標行支持的控件:
=>數字源端口
可能是什么問題?
注意:我不是在Windows操作系統上,而是在Xubuntu(linux)操作系統上。 這就是為什么我沒有Java聲音音頻引擎但有PulseAudioMixer的原因。
我也發現安德魯在評論中對各行支持不一的說法是正確的。 此外,如果存在音量控制,通常也不理想。 它只能隨着音頻數據的每個緩沖區加載而改變音量,因此快速變化往往會導致緩沖區之間的電平跳變較大,進而導致咔嗒聲或拉鏈效果。
我建議編寫自己的控件。 在Java教程中,有一個很好的示例可以用作起始結構,該部分稱為使用文件和格式轉換器 。 在“讀取聲音文件”標題下有一個簡短的代碼示例。 注意評論:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
那時,您可以將字節轉換為PCM數據,然后將這些值乘以音量系數(通常是從0到1的浮點數),然后再轉換回字節以進行播放。 您可以編寫自己的緩沖區,使緩沖區變小,或者提出其他方案來分散音量變化,以免突然變化。 而且,可以進行功能,以便從0到1的變化將更緊密地映射感知到的音量。 對於所有這些步驟,您可以查閱StackOverflow上的先前文章。
我只記得Java教程中有關控件的最后一部分。 在那里,他們提到了編寫自己的選項。 不幸的是,他們當時並沒有提供很多示例。
使用PulseAudio時,即使在最新的JDK中,Linux上的JavaSound確實沒有控件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.