如何在Java中使用给定的采样率播放声音?

4

我想知道是否有一个库或其他东西可以在给定示例速率(20-20,000 Hz)上播放声音。实际上,我找到了 一些内容,但我不理解如何让它工作!

1个回答

7
这里有一个完整的示例,不需要任何外部库:
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

此文章将帮助您了解如何使用Java实现AES加密。AES是一种常用的对称加密算法,可用于保护敏感数据的机密性。以下是一个简单的Java代码示例,演示如何使用AES加密和解密文本。


嗨@slaadvak!在那段代码中,SoundUtils是什么?SoundUtils.tone(400,500, 0.2); - user3538081
“SoundUtils”是作者在示例中创建的类名(请参见示例开头的“public class SoundUtils {”)。您可以像底部示例中看到的那样直接重用此类。 - slaadvak
@slaadvak 我想知道为什么sdl被创建为af应该被打开(af)?这是为了引入冗余性(我们可爱的语法盐)吗?我喜欢你所说的“声音”指的是正弦波。这确实是“声音”(你能否证明不是?)并且做到了所要求的。对吧? - Val
@Val open() 被调用以获取系统的 "sound" 资源。这类似于在执行读取或写入操作之前打开文件。是的,它是一个真正的正弦波。以下是1Khz频率下buf[]内容的示例:0, 89, 127, 89, 0, -89, -127, -89, 0, ... - slaadvak
@slaadvak 你的意思是file = open(name); open(file);很典型吗?读/写在哪里?关于正弦波,我不想知道它是否真实。我想知道的是,它在问题中是如何发声的。 - Val

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接