【发布时间】:2021-08-04 07:04:38
【问题描述】:
我正在开发一个音频扬声器项目。我从前端收到实时的byte[] 消息,因此我用javax.sound 包构建了一个扬声器实例来播放消息。
问题是:当我将声道编号更改为2(即立体声音频)时,我得到了失真的音频。我应该安排某种立体声麦克风或其他特定设备来修复它吗?还是我初始化喇叭的方式不对?
这是初始化扬声器的代码:
import javax.sound.sampled.*;
public class SpeakerWriter {
public static final AudioFormat FORMAT_1 = new AudioFormat(44100.0f, 16, 1, true, false);
//16 is sample size in bits & 1 is channel number
private static AudioFormat format = FORMAT_1;
private SourceDataLine speakers;
public SourceDataLine getSpeakers() {
try {
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
speakers = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
speakers.open(format);
speakers.start();
}
catch(LineUnavailableException e) {
e.printStackTrace();
}
return speakers;
}
}
顺便说一下,我用 Golang 重构了代码,但问题仍然存在。
【问题讨论】:
-
嗨佳宇,欢迎来到 Stack Overflow!尝试使用与您在示例中提供给我们的上下文相关的标签(例如,您只提供 Java 代码,但使用
go标记您的问题)。 -
我不清楚我理解这个问题。通道设置为 1 时数据是否正确播放,通道设置为 2 时数据是否失真?如果是这样,您是为新曲目添加额外数据,还是希望 Java 提供数据?否则,当您将通道数设置为 2 时,SourceDataLine 将假定单声道本身是左右音频 PCM。
-
嗨菲尔,你的理解是正确的。没有更多的数据被添加到新的轨道上,java 也没有提供新的数据。那么扬声器的配置很好,我应该对原始数据进行什么处理才能将单声道声音转换为立体声?我应该购买立体声麦克风来收集双轨数据吗?感谢您的帮助!