【问题标题】:How to play a sound with a given sample rate in Java?如何在 Java 中以给定的采样率播放声音?
【发布时间】:2014-04-15 23:50:12
【问题描述】:

我想知道是否有库或其他东西可以在给定的采样率(20-20,000 Hz)上播放声音。实际上,我找到了something,但我不明白如何让它工作!

【问题讨论】:

    标签: java audio sampling


    【解决方案1】:

    这是不需要任何外部库的完整示例:

    import javax.sound.sampled.*;
    
    public class SoundUtils {
    
      public static float SAMPLE_RATE = 8000f;
    
      public static void tone(int hz, int msecs) 
         throws LineUnavailableException 
      {
         tone(hz, msecs, 1.0);
      }
    
      public static void tone(int hz, int msecs, double vol)
          throws LineUnavailableException 
      {
        byte[] buf = new byte[1];
        AudioFormat af = 
            new AudioFormat(
                SAMPLE_RATE, // sampleRate
                8,           // sampleSizeInBits
                1,           // channels
                true,        // signed
                false);      // bigEndian
        SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
        sdl.open(af);
        sdl.start();
        for (int i=0; i < msecs*8; i++) {
          double angle = i / (SAMPLE_RATE / hz) * 2.0 * Math.PI;
          buf[0] = (byte)(Math.sin(angle) * 127.0 * vol);
          sdl.write(buf,0,1);
        }
        sdl.drain();
        sdl.stop();
        sdl.close();
      }
    
      public static void main(String[] args) throws Exception {
        SoundUtils.tone(1000,100);
        Thread.sleep(1000);
        SoundUtils.tone(100,1000);
        Thread.sleep(1000);
        SoundUtils.tone(5000,100);
        Thread.sleep(1000);
        SoundUtils.tone(400,500);
        Thread.sleep(1000);
        SoundUtils.tone(400,500, 0.2);
    
      }
    }
    

    来源:http://www.rgagnon.com/javadetails/java-0499.html

    【讨论】:

    • 嗨@slaadvak!在那段代码中,SoundUtils 是什么? SoundUtils.tone(400,500, 0.2);
    • SoundUtils 是作者在其示例中创建的类的名称(参见示例开头的public class SoundUtils {)。您可以按原样重用这个类,就像您在示例底部的 main 方法中看到的那样。
    • @slaadvak 我想知道为什么要打开(af)作为 af 的 sdl?是否介绍了冗余(我们可爱的句法盐)。我喜欢“声音”,你的意思是正弦波。这真的是a sound(你能证明别的吗?)并且按照要求做。对吗?
    • @Val open() 被调用来获取系统的“声音”资源。这类似于在对文件进行读取或写入之前打开文件。是的,它是一个真正的正弦波。以下是 1Khz 频率的 buf[] 内容示例:0, 89, 127, 89, 0, -89, -127, -89, 0, ...
    • @slaadvak 你的意思是file = open(name); open(file); 是典型的吗?读/写在哪里?关于正弦波,我不想知道它是否真实。我很想知道问题中要求的声音如何?
    猜你喜欢
    • 2012-04-03
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2010-09-06
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多