Как да изпратите аудио поток чрез 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