1

我正在尝试在 Ubuntu 11.10 笔记本电脑上用 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 是合法的?我已经尝试过的是切换有符号/无符号和小/大端的布尔值。

4

2 回答 2

2

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

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

于 2011-11-26T18:08:18.383 回答
0

一年后,我也遇到了同样的问题。不过,我发现了一些东西;在 c.getInfo() 返回 DataLine.Info 的假设下,以下给出了支持的格式:

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

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

于 2013-04-11T11:02:19.953 回答