2011-11-26 137 views
1

我想在Ubuntu 11.10笔记本电脑上用Java写一个自定义合成器。这是我的代码:如何在Java中合成声音?

package com.sibbo.audio; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.Clip; 
import javax.sound.sampled.LineUnavailableException; 

public class Audio { 
    public static void main(String[] args) throws LineUnavailableException { 
     byte[] data = new byte[16000 * 2]; 

     sinus(data); 

     AudioFormat format = new AudioFormat(16000, 8, 1, true, true); 
     Clip c = javax.sound.sampled.AudioSystem.getClip(); 
     c.open(format, data, 0, data.length); // throws IllegalArgumentException 
    } 

    private static void sinus(byte[] data) { 
     for (int i = 0; i < data.length; i++) { 
      data[i] = (byte) (Math.sin(i/200.0) * 127); 
     } 
    } 
} 

在标记的行,它会抛出一个异常,说:“格式无效”。我怎样才能找出哪些AudioFormats是合法的?我已经试过的是切换有符号/无符号和小/大端的布尔值。

回答

2

我认为错误信息是相反的意思。它并不是抱怨系统不支持AudioFormat,而是不能将数据解析为这种格式。从Javadoc

抛出:
- 如果缓冲区大小不表示样本帧的整数倍,或者,如果格式不完全指定或无效

+0

缓冲区的大小似乎对我来说没问题...您对格式有什么看法?顺便说一句,我试图用SourceDataLine解决这个问题,但是用我的第一种方法解决这个问题真的很不错。 – Sibbo

0

我具有同样的问题,一年后。尽管如此,我想出了一些东西。该c.getInfo()返回一个DataLine.Info的假设下,下面给出了支持的格式:

((DataLine.Info)clip.getLineInfo()).getFormats() 

出于某种原因,我的只有一个支持的格式,这是有点奇怪。另外,我遵循这些代码,并且在支持列表中使用AudioFormat不会出现“格式无效”的错误。