Как отправить аудиопоток через UDP в java?

У меня проблема, я установил MediaLocator на микрофонный вход, а затем создал Player. Мне нужно захватить этот звук с микрофона, закодировать его в поток более низкого качества и отправить его в виде пакета дейтаграммы через UDP. Вот код, большую часть которого я нашел в Интернете и адаптировал для своего приложения:

public class AudioSender extends Thread {

private MediaLocator ml = new MediaLocator("javasound://44100");
private DatagramSocket socket;
private boolean transmitting;
private Player player;
TargetDataLine mic;
byte[] buffer;
private AudioFormat format;


private DatagramSocket datagramSocket(){
    try {
        return new DatagramSocket();
    } catch (SocketException ex) {
        return null;
    }
}

private void startMic() {
    try {
        format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0F, 16, 2, 4, 8000.0F, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        mic = (TargetDataLine) AudioSystem.getLine(info);
        mic.open(format);
        mic.start();
        buffer = new byte[1024];
    } catch (LineUnavailableException ex) {
        Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private Player createPlayer() {
    try {
        return Manager.createRealizedPlayer(ml);
    } catch (IOException ex) {
        return null;
    } catch (NoPlayerException ex) {
        return null;
    } catch (CannotRealizeException ex) {
        return null;
    }
}

private void send() {
    try {
        mic.read(buffer, 0, 1024);
        DatagramPacket packet = 
            new DatagramPacket(
                buffer, buffer.length, InetAddress.getByName(Util.getRemoteIP()), 91);
        socket.send(packet);
    } catch (IOException ex) {
        Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void run() {
    player = createPlayer();
    player.start();
    socket = datagramSocket();
    transmitting = true;
    startMic();
    while (transmitting) {
        send();
    }  
}

public static void main(String[] args) {
    AudioSender as = new AudioSender();
    as.start();
}

}

И единственное, что происходит, когда я запускаю класс приемника, это то, что я слышу этого игрока из класса отправителя. И я не вижу связи между TargetDataLine и Player. По сути, мне нужно получить проигрыватель звуковой формы и каким-то образом преобразовать его в байты [], поэтому я могу отправить его в виде дейтаграммы. Любые идеи? Все приемлемо, пока работает :)


person Nob Venoda    schedule 18.01.2010    source источник
comment
Вместо проигрывателя следует использовать раковину...   -  person Daniel Voina    schedule 11.03.2012


Ответы (1)


Здесь вам не нужен класс Player, вы хотите использовать классы в javax.sound.sampled. Насколько я могу судить, Player предназначен для воспроизведения звука, а не для доступа к его содержимому.

Я не проверял это, но попробуйте использовать .read в TargetDataLine, который вы создаете, чтобы заполнить буфер, а затем отправить буфер на другой хост.

person Justin Smith    schedule 18.01.2010
comment
Итак, .read(buffer, 0, buffer.size) заполняет заданный буфер? Попробую так, спасибо :) - person Nob Venoda; 18.01.2010