1

Ubuntu11.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);
        }
    }
}

マークされた行で、「無効な形式」という例外がスローされます。どのAudioFormatが合法かをどのように判断できますか?私がすでに試したことは、符号付き/符号なしとリトルエンディアン/ビッグエンディアンのブール値を切り替えることです。

4

2 に答える 2

2

エラーメッセージはその逆を意味していると思います。AudioFormatがシステムでサポートされていないことについては不満はありませんが、代わりにデータをこの形式に解析することはできません。Javadocから:

スロー:
IllegalArgumentException-バッファサイズがサンプルフレームの整数を表していない場合、またはフォーマットが完全に指定されていないか無効である場合

于 2011-11-26T18:08:18.383 に答える
0

1年後、私は同じ問題を抱えています。しかし、私は何かを理解しました。c.getInfo()がDataLine.Infoを返すという仮定の下で、以下はサポートされている形式を示します。

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

どういうわけか、私のサポートされているフォーマットは1つだけで、それはちょっと奇妙です。また、コードに従いましたが、サポートされているリストにないAudioFormatを使用すると、「無効な形式」というエラーが表示されます。

于 2013-04-11T11:02:19.953 に答える