QA@IT

java言語に関する質問_javax.soundによる音声の入出力に関して

5044 PV

こんにちは
こちらの掲示板では初めての質問です。
よろしくお願いします。

私は下記のサイトのソースを実行しました。
http://ohwhsmm7.blog28.fc2.com/blog-entry-22.html

すると、下記のエラーが発生しました。
【今回の質問】
このエラーの回避方法
そして、回避した状態での音声入出力の方法を教えて下さい。

【エラー】
Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian is supported.
at javax.sound.sampled.AudioSystem.getLine(Unknown Source)
at Player.(Player.java:35)
at Voice.main(Voice.java:5)

【エラー発生箇所】
Playerjava:35
source = (SourceDataLine)AudioSystem.getLine( info );
Voice.java:5
Player m_CPlay = new Player();

【実行環境】
・Windows7
・eclipse luna
【インストールしているJava関係のソフト】
・Java 7 Update67
・Java 8 Update 11(64-bit)
・Java SE Development Kit 7 Update 55(64-bit)
・Java SE Development Kit 8 Update 11(64-bit)

回答

出力するミキサーが見つからないといったエラーになりますので、
PCのサウンド環境を確認してみてください。
(サウンド機能がオフになっていたりしないか)

例えば私の環境だと、マイクを指しておかないとRecorderのコンストラクタで同様のエラーが発生します。

あとはbit数などを調整してみる手もあると思います。
BITSを24, HZを44100, MONOを2(チャンネル数2なのでステレオですが)にしてみるとか。

Voice.javaの最初に以下の様なコードを書くとdefaultミキサーがサポートしている
組み合わせが表示できるみたいなので参考になるかもしれません。
(実際はdefault以外のミキサーも検索されるのでこれで表示されるものだけではないのですが)

(参考: http://stackoverflow.com/questions/6002444/java-recording-from-mixer )

public static void main( String[] args )
{
  Mixer mixer = AudioSystem.getMixer(null); // default mixer
  try {
    mixer.open();
    System.out.printf("Supported SourceDataLines of default mixer (%s):\n\n", mixer.getMixerInfo().getName());
    for(Line.Info info : mixer.getSourceLineInfo()) {
        if(SourceDataLine.class.isAssignableFrom(info.getLineClass())) {
            SourceDataLine.Info info2 = (SourceDataLine.Info) info;
            System.out.println(info2);
            System.out.printf("  max buffer size: \t%d\n", info2.getMaxBufferSize());
            System.out.printf("  min buffer size: \t%d\n", info2.getMinBufferSize());
            AudioFormat[] formats = info2.getFormats();
            System.out.println("  Supported Audio formats: ");
            for(AudioFormat format : formats) {
                System.out.println("    "+format);
            }
            System.out.println();
        } else {
            System.out.println(info.toString());
        }
        System.out.println();
    }

    mixer.close();
  } catch (LineUnavailableException e1) {
    // TODO 自動生成された catch ブロック
    e1.printStackTrace();
  }
編集 履歴 (0)
  • 素晴らしい・・・ -
ウォッチ

この質問への回答やコメントをメールでお知らせします。