我想在音频数据上使用TarsosDSP的某些功能。输入的数据是立体声,但是Tarsos仅支持单声道,因此我尝试按以下方式将其传输到单声道,但是结果听起来仍然像立体声数据解释为单声道,即通过MultichannelToMono
进行的转换似乎没有任何意义。效果很快,尽管其实现看起来不错。
@Test
public void testPlayStereoFile() throws IOException, UnsupportedAudioFileException, LineUnavailableException {
AudioDispatcher dispatcher = AudioDispatcherFactory.fromFile(FILE,4096,0);
dispatcher.addAudioProcessor(new MultichannelToMono(dispatcher.getFormat().getChannels(), false));
dispatcher.addAudioProcessor(new AudioPlayer(dispatcher.getFormat()));
dispatcher.run();
}
我在这里做错什么吗?为什么
MultichannelToMono
处理器不将数据传输到单声道? 最佳答案
我发现可行的唯一方法是在将数据发送到TarsosDSP之前使用Java音频系统执行此转换,看来它无法正确转换帧大小
我在https://www.experts-exchange.com/questions/26925195/java-stereo-to-mono-conversion-unsupported-conversion-error.html处找到了以下代码段,在使用TarsosDSP应用更高级的音频转换之前,可以将其转换为单声道。
public static AudioInputStream convertToMono(AudioInputStream sourceStream) {
AudioFormat sourceFormat = sourceStream.getFormat();
// is already mono?
if(sourceFormat.getChannels() == 1) {
return sourceStream;
}
AudioFormat targetFormat = new AudioFormat(
sourceFormat.getEncoding(),
sourceFormat.getSampleRate(),
sourceFormat.getSampleSizeInBits(),
1,
// this is the important bit, the framesize needs to change as well,
// for framesize 4, this calculation leads to new framesize 2
(sourceFormat.getSampleSizeInBits() + 7) / 8,
sourceFormat.getFrameRate(),
sourceFormat.isBigEndian());
return AudioSystem.getAudioInputStream(targetFormat, sourceStream);
}