javax.звук.отобранный.LineUnavailableException при попытке записи звука

Я делаю программу голосового чата java и голосовой класс на стороне сервера бросает эту ошибку

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 8 bit, mono, 1 bytes/frame,  not supported.
    at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513)
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121)
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:153)
    at client.VoiceUser.run(VoiceUser.java:34)

ошибка создается в этой строке кода

microphone.open(audioformat);

Код:

package client;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class VoiceUser extends Thread {
    private ObjectOutputStream clientOutput;
    private TargetDataLine microphone;
    private ArrayList<ObjectOutputStream> vOutputArray = new ArrayList<ObjectOutputStream>();
    private AudioFormat audioformat;

    public VoiceUser(Socket sv, ArrayList<ObjectOutputStream> outputArray) throws LineUnavailableException {
        try {
            clientOutput = new ObjectOutputStream(sv.getOutputStream());
            vOutputArray.equals(clientOutput);
            vOutputArray.add(clientOutput);
        } catch (IOException e) {
            System.out.println("Can't create stable connection between server and client");
        }
    }
    public void run() {
        try {
            DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioformat);
            microphone = (TargetDataLine)AudioSystem.getLine(info);
            audioformat = new AudioFormat(8000.0f,8,1,true,false);
            microphone.open(audioformat);
            microphone.start();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
        int bytesRead = 0;
        byte[] soundData = new byte[3072];
        int offset = 0;
        while(bytesRead != -1)
        {
            bytesRead = microphone.read(soundData, 0, soundData.length);
            if(bytesRead >= 0) {
                offset += bytesRead;
                if(offset == soundData.length) {
                    send(soundData, bytesRead);
                    offset = 0;
                }
            }
        }
    }
public void send(byte[] soundData, int bytesRead) {
    for(ObjectOutputStream o : vOutputArray) {
        try {
            o.write(soundData, 0, bytesRead);
            o.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
}
}

1 ответ

  1. Это говорит вам, что линия недоступна. Есть несколько причин — ваша звуковая карта не поддерживает запись в указанном вами формате. Вы можете попробовать различные форматы, например, 22050Hz может поддерживаться.

    Еще одна причина, звуковая карта уже занята записью. На Windows вы не можете записывать с двумя микрофонами одновременно. Вам необходимо изменить дизайн сервера, чтобы разрешить только один сеанс записи.