【问题标题】:An audio distortion problem when I use javax.sound package使用 javax.sound 包时的音频失真问题
【发布时间】: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 也没有提供新的数据。那么扬声器的配置很好,我应该对原始数据进行什么处理才能将单声道声音转换为立体声?我应该购买立体声麦克风来收集双轨数据吗?感谢您的帮助!

标签: java audio


【解决方案1】:

您确定您的文件是 BigEndian 吗?如果没有,我会尝试将 BigEndian 值更改为“false”。我认为这种情况要普遍得多,而且弄错往往会造成失真。

【讨论】:

  • 谢谢!我在代码中将格式设置为 LittlelEndian。 public static final AudioFormat FORMAT_1 = new AudioFormat(44100.0f, 16, 1, true, false); 最后一个参数表示将BigEndian 值设置为false。而true 之前的值表示签名数据。
  • 因此我认为字节序不是重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2015-06-29
相关资源
最近更新 更多